Browse Source

some improvements

ceriel 38 years ago
parent
commit
2ab00b6e06
5 changed files with 90 additions and 90 deletions
  1. 79 85
      lang/m2/comp/LLlex.c
  2. 1 0
      lang/m2/comp/LLlex.h
  3. 4 3
      lang/m2/comp/Makefile
  4. 5 1
      lang/m2/comp/declar.g
  5. 1 1
      lang/m2/comp/main.c

+ 79 - 85
lang/m2/comp/LLlex.c

@@ -10,37 +10,97 @@
 #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 = ˙
 	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);
-	}
-}

+ 1 - 0
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	*/

+ 4 - 3
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:

+ 5 - 1
lang/m2/comp/declar.g

@@ -177,5 +177,9 @@ VariableDeclaration
 {
 	struct id_list *VarList;
 } :
-	IdentList(&VarList) ':' type
+	IdentList(&VarList)
+	[
+		ConstExpression
+	]?
+	':' type
 ;

+ 1 - 1
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;