some improvements
authorceriel <none@none>
Mon, 24 Mar 1986 17:29:57 +0000 (17:29 +0000)
committerceriel <none@none>
Mon, 24 Mar 1986 17:29:57 +0000 (17:29 +0000)
lang/m2/comp/LLlex.c
lang/m2/comp/LLlex.h
lang/m2/comp/Makefile
lang/m2/comp/declar.g
lang/m2/comp/main.c

index 7380c3f..17c92ad 100644 (file)
 #include "LLlex.h"
 
 long str2long();
-char *GetString();
 
 struct token dot, aside;
 
 static char *RcsId = "$Header$";
 
-int
-LLlex()
+/*     Skip Modula-2 like comment (* ... *).
+       Note that comment may be nested.
+*/
+static
+SkipComment()
 {
-       /*      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;
+       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);
        }
+}
 
-       return DOT;
+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
-GetToken(tk)
-       register struct token *tk;
+LLlex()
 {
+       register struct token *tk = &dot;
        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);
-       }
-}
index e6a2dd8..594a0cf 100644 (file)
@@ -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       */
index c367db2..e0c7459 100644 (file)
@@ -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:
index f1f77a0..c3cc67c 100644 (file)
@@ -177,5 +177,9 @@ VariableDeclaration
 {
        struct id_list *VarList;
 } :
-       IdentList(&VarList) ':' type
+       IdentList(&VarList)
+       [
+               ConstExpression
+       ]?
+       ':' type
 ;
index ba0b0b9..b0cfbc3 100644 (file)
@@ -9,7 +9,7 @@
 #include "LLlex.h"
 #include "Lpars.h"
 
-static char *RcsId = "$Header:";
+static char *RcsId = "$Header$";
 
 char options[128];
 char *ProgName;