some improvements
This commit is contained in:
parent
0d63470af3
commit
0e39681621
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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…
Reference in a new issue