From 0e396816210c4418be20dc97e0b9d185c6b49913 Mon Sep 17 00:00:00 2001 From: ceriel Date: Mon, 24 Mar 1986 17:29:57 +0000 Subject: [PATCH] some improvements --- lang/m2/comp/LLlex.c | 172 ++++++++++++++++++++---------------------- lang/m2/comp/LLlex.h | 1 + lang/m2/comp/Makefile | 7 +- lang/m2/comp/declar.g | 6 +- lang/m2/comp/main.c | 2 +- 5 files changed, 94 insertions(+), 94 deletions(-) diff --git a/lang/m2/comp/LLlex.c b/lang/m2/comp/LLlex.c index 7380c3fed..17c92ad2c 100644 --- a/lang/m2/comp/LLlex.c +++ b/lang/m2/comp/LLlex.c @@ -10,37 +10,97 @@ #include "LLlex.h" long str2long(); -char *GetString(); struct token dot, aside; static char *RcsId = "$Header$"; +/* Skip Modula-2 like comment (* ... *). + Note that comment may be nested. +*/ +static +SkipComment() +{ + register int ch; + register int NestLevel = 0; + + LoadChar(ch); + for (;;) { + if (class(ch) == STNL) { + LineNumber++; + } + else + if (ch == '(') { + LoadChar(ch); + if (ch == '*') { + ++NestLevel; + } + else { + continue; + } + } + else + if (ch == '*') { + LoadChar(ch); + if (ch == ')') { + if (NestLevel-- == 0) { + return; + } + } + else { + continue; + } + } + LoadChar(ch); + } +} + +static char * +GetString(upto) +{ + register int ch; + int str_size; + char *str = Malloc(str_size = 32); + register int pos = 0; + + LoadChar(ch); + while (ch != upto) { + if (class(ch) == STNL) { + lexerror("newline in string"); + LineNumber++; + break; + } + if (ch == EOI) { + lexerror("end-of-file in string"); + break; + } + str[pos++] = ch; + if (pos == str_size) { + str = Srealloc(str, str_size += 8); + } + LoadChar(ch); + } + str[pos] = '\0'; + return str; +} + +/* LLlex() plays the role of Lexical Analyzer for the parser. + The putting aside of tokens is taken into account. +*/ int LLlex() { - /* LLlex() plays the role of Lexical Analyzer for the parser. - The putting aside of tokens is taken into account. - */ - if (ASIDE) { /* a token is put aside */ - dot = aside; - ASIDE = 0; - } - else { - GetToken(&dot); - if (DOT == EOI) DOT = -1; - } - - return DOT; -} - -int -GetToken(tk) - register struct token *tk; -{ + register struct token *tk = ˙ char buf[(IDFSIZE > NUMSIZE ? IDFSIZE : NUMSIZE) + 1]; register int ch, nch; + if (ASIDE) { /* a token is put aside */ + *tk = aside; + ASIDE = 0; + return tk->tk_symb; + } + tk->tk_lineno = LineNumber; + again: LoadChar(ch); if ((ch & 0200) && ch != EOI) { @@ -54,6 +114,7 @@ again: case STNL: LineNumber++; + tk->tk_lineno++; goto again; case STGARB: @@ -305,79 +366,12 @@ Sdec: } case STEOI: - return tk->tk_symb = EOI; + return tk->tk_symb = -1; case STCHAR: default: crash("bad character class %d", class(ch)); } + /*NOTREACHED*/ } -char * -GetString(upto) -{ - register int ch; - int str_size; - char *str = Malloc(str_size = 32); - register int pos = 0; - - LoadChar(ch); - while (ch != upto) { - if (class(ch) == STNL) { - lexerror("newline in string"); - LineNumber++; - break; - } - if (ch == EOI) { - lexerror("end-of-file in string"); - break; - } - str[pos++] = ch; - if (pos == str_size) { - str = Srealloc(str, str_size += 8); - } - LoadChar(ch); - } - str[pos] = '\0'; - return str; -} - -SkipComment() -{ - /* Skip Modula-2 like comment (* ... *). - Note that comment may be nested. - */ - - register int ch; - register int NestLevel = 0; - - LoadChar(ch); - for (;;) { - if (class(ch) == STNL) { - LineNumber++; - } - else - if (ch == '(') { - LoadChar(ch); - if (ch == '*') { - ++NestLevel; - } - else { - continue; - } - } - else - if (ch == '*') { - LoadChar(ch); - if (ch == ')') { - if (NestLevel-- == 0) { - return; - } - } - else { - continue; - } - } - LoadChar(ch); - } -} diff --git a/lang/m2/comp/LLlex.h b/lang/m2/comp/LLlex.h index e6a2dd810..594a0cf52 100644 --- a/lang/m2/comp/LLlex.h +++ b/lang/m2/comp/LLlex.h @@ -4,6 +4,7 @@ struct token { int tk_symb; /* token itself */ + int tk_lineno; /* linenumber on which it occurred */ union { struct idf *tk_idf; /* IDENT */ char *tk_str; /* STRING */ diff --git a/lang/m2/comp/Makefile b/lang/m2/comp/Makefile index c367db296..e0c745953 100644 --- a/lang/m2/comp/Makefile +++ b/lang/m2/comp/Makefile @@ -4,12 +4,13 @@ HDIR = ../../em/h PKGDIR = ../../em/pkg LIBDIR = ../../em/lib -INCLUDES = -I$(HDIR) -I$(PKGDIR) -I/user1/erikb/h +INCLUDES = -I$(HDIR) -I$(PKGDIR) -I/user1/erikb/em/h LSRC = tokenfile.g program.g declar.g expression.g statement.g CC = cc GEN = LLgen GENOPTIONS = -CFLAGS = -DDEBUG -O $(INCLUDES) +CFLAGS = -DDEBUG -p $(INCLUDES) +LFLAGS = -p LOBJ = tokenfile.o program.o declar.o expression.o statement.o COBJ = LLlex.o LLmessage.o char.o error.o main.o \ symbol2str.o tokenname.o idf.o input.o idlist.o @@ -27,7 +28,7 @@ LLfiles: $(LSRC) @touch LLfiles main: $(OBJ) Makefile - $(CC) $(LFLAGS) $(OBJ) $(LIBDIR)/libcomp.a /user1/erikb/em/lib/libstr.a /user1/erikb/lib/libsystem.a -o main + $(CC) $(LFLAGS) $(OBJ) $(LIBDIR)/libcomp.a $(LIBDIR)/malloc.o /user1/erikb/em/lib/libstr.a /user1/erikb/em/lib/libsystem.a -o main size main clean: diff --git a/lang/m2/comp/declar.g b/lang/m2/comp/declar.g index f1f77a05d..c3cc67c9d 100644 --- a/lang/m2/comp/declar.g +++ b/lang/m2/comp/declar.g @@ -177,5 +177,9 @@ VariableDeclaration { struct id_list *VarList; } : - IdentList(&VarList) ':' type + IdentList(&VarList) + [ + ConstExpression + ]? + ':' type ; diff --git a/lang/m2/comp/main.c b/lang/m2/comp/main.c index ba0b0b970..b0cfbc3f6 100644 --- a/lang/m2/comp/main.c +++ b/lang/m2/comp/main.c @@ -9,7 +9,7 @@ #include "LLlex.h" #include "Lpars.h" -static char *RcsId = "$Header:"; +static char *RcsId = "$Header$"; char options[128]; char *ProgName;