some improvements
This commit is contained in:
		
							parent
							
								
									0d63470af3
								
							
						
					
					
						commit
						0e39681621
					
				
					 5 changed files with 94 additions and 94 deletions
				
			
		|  | @ -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() | ||||
| { | ||||
| 	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. | ||||
| */ | ||||
| 	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; | ||||
| 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); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -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,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: | ||||
|  |  | |||
|  | @ -177,5 +177,9 @@ VariableDeclaration | |||
| { | ||||
| 	struct id_list *VarList; | ||||
| } : | ||||
| 	IdentList(&VarList) ':' type | ||||
| 	IdentList(&VarList) | ||||
| 	[ | ||||
| 		ConstExpression | ||||
| 	]? | ||||
| 	':' type | ||||
| ; | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ | |||
| #include "LLlex.h" | ||||
| #include "Lpars.h" | ||||
| 
 | ||||
| static char *RcsId = "$Header:"; | ||||
| static char *RcsId = "$Header$"; | ||||
| 
 | ||||
| char options[128]; | ||||
| char *ProgName; | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue