From 5cddb264d430d7c9b4defd63d823d98bf002f4d1 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 30 May 1996 11:04:07 -0300 Subject: [PATCH] lexical analiser may use luaI_buffer, instead of waste space with a separate buffer. --- lex.c | 143 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 69 insertions(+), 74 deletions(-) diff --git a/lex.c b/lex.c index 7c496f9a..cbb7b082 100644 --- a/lex.c +++ b/lex.c @@ -1,5 +1,5 @@ -char *rcs_lex = "$Id: lex.c,v 2.32 1996/03/21 16:33:47 roberto Exp roberto $"; - +char *rcs_lex = "$Id: lex.c,v 2.33 1996/05/28 21:07:32 roberto Exp roberto $"; + #include #include @@ -14,32 +14,24 @@ char *rcs_lex = "$Id: lex.c,v 2.32 1996/03/21 16:33:47 roberto Exp roberto $"; #define MINBUFF 260 -#define next() { current = input(); } -#define save(x) { *yytextLast++ = (x); } -#define save_and_next() { save(current); next(); } +#define next() (current = input()) +#define save(x) (yytext[tokensize++] = (x)) +#define save_and_next() (save(current), next()) -static int current; -static char *yytext = NULL; -static int textsize = 0; -static char *yytextLast; -static Input input; +static int current; /* look ahead character */ +static Input input; /* input function */ + void lua_setinput (Input fn) { current = ' '; input = fn; - if (yytext == NULL) - { - textsize = MINBUFF; - yytext = newvector(textsize, char); - } } char *lua_lasttext (void) { - *yytextLast = 0; - return yytext; + return luaI_buffer(1); } @@ -80,70 +72,69 @@ void luaI_addReserved (void) } -static void growtext (void) -{ - int size = yytextLast - yytext; - textsize = growvector(&yytext, textsize, char, lexEM, MAX_WORD); - yytextLast = yytext + size; -} - - -static int read_long_string (void) +static int read_long_string (char *yytext, int buffsize) { int cont = 0; - int spaceleft = textsize - (yytextLast - yytext); + int tokensize = 2; /* '[[' already stored */ while (1) { - if (spaceleft <= 2) /* may read more than 1 char in one cicle */ - { - growtext(); - spaceleft = textsize - (yytextLast - yytext); - } + if (buffsize-tokensize <= 2) /* may read more than 1 char in one cicle */ + yytext = luaI_buffer(buffsize *= 2); switch (current) { case EOF: case 0: + save(0); return WRONGTOKEN; case '[': - save_and_next(); spaceleft--; + save_and_next(); if (current == '[') { cont++; - save_and_next(); spaceleft--; + save_and_next(); } - continue; + continue; case ']': - save_and_next(); spaceleft--; + save_and_next(); if (current == ']') { - if (cont == 0) return STRING; + if (cont == 0) goto endloop; cont--; - save_and_next(); spaceleft--; + save_and_next(); } - continue; + continue; case '\n': lua_linenumber++; /* goes through */ default: - save_and_next(); spaceleft--; + save_and_next(); } - } + } endloop: + save_and_next(); /* pass the second ']' */ + yytext[tokensize-2] = 0; /* erases ']]' */ + luaY_lval.vWord = luaI_findconstantbyname(yytext+2); + yytext[tokensize-2] = ']'; /* restores ']]' */ + save(0); + return STRING; } - int luaY_lex (void) { - double a; static int linelasttoken = 0; + double a; + int buffsize = MINBUFF; + char *yytext = luaI_buffer(buffsize); + yytext[1] = yytext[2] = yytext[3] = 0; if (lua_debug) luaI_codedebugline(linelasttoken); linelasttoken = lua_linenumber; while (1) { - yytextLast = yytext; + int tokensize = 0; switch (current) { case EOF: case 0: + save(0); return 0; case '\n': linelasttoken = ++lua_linenumber; case ' ': @@ -153,16 +144,16 @@ int luaY_lex (void) continue; case '$': - next(); + save_and_next(); while (isalnum(current) || current == '_') save_and_next(); - *yytextLast = 0; - if (strcmp(yytext, "debug") == 0) + save(0); + if (strcmp(yytext+1, "debug") == 0) { luaY_lval.vInt = 1; return DEBUG; } - else if (strcmp(yytext, "nodebug") == 0) + else if (strcmp(yytext+1, "nodebug") == 0) { luaY_lval.vInt = 0; return DEBUG; @@ -181,12 +172,7 @@ int luaY_lex (void) else { save_and_next(); /* pass the second '[' */ - if (read_long_string() == WRONGTOKEN) - return WRONGTOKEN; - save_and_next(); /* pass the second ']' */ - *(yytextLast-2) = 0; /* erases ']]' */ - luaY_lval.vWord = luaI_findconstantbyname(yytext+2); - return STRING; + return read_long_string(yytext, buffsize); } case '=': @@ -213,21 +199,17 @@ int luaY_lex (void) case '\'': { int del = current; - int spaceleft = textsize - (yytextLast - yytext); - next(); /* skip the delimiter */ + save_and_next(); while (current != del) { - if (spaceleft <= 2) /* may read more than 1 char in one cicle */ - { - growtext(); - spaceleft = textsize - (yytextLast - yytext); - } - spaceleft--; + if (buffsize-tokensize <= 2) /* may read more than 1 char in one cicle */ + yytext = luaI_buffer(buffsize *= 2); switch (current) { case EOF: case 0: case '\n': + save(0); return WRONGTOKEN; case '\\': next(); /* do not save the '\' */ @@ -244,9 +226,11 @@ int luaY_lex (void) save_and_next(); } } - next(); /* skip the delimiter */ - *yytextLast = 0; - luaY_lval.vWord = luaI_findconstantbyname(yytext); + next(); /* skip delimiter */ + save(0); + luaY_lval.vWord = luaI_findconstantbyname(yytext+1); + tokensize--; + save(del); save(0); /* restore delimiter */ return STRING; } @@ -266,7 +250,7 @@ int luaY_lex (void) { TaggedString *ts; do { save_and_next(); } while (isalnum(current) || current == '_'); - *yytextLast = 0; + save(0); ts = lua_createstring(yytext); if (ts->marked > 2) return ts->marked; /* reserved word */ @@ -285,8 +269,7 @@ int luaY_lex (void) save_and_next(); return DOTS; /* ... */ } - else - return CONC; /* .. */ + else return CONC; /* .. */ } else if (!isdigit(current)) return '.'; /* current is a digit: goes through to number */ @@ -296,12 +279,19 @@ int luaY_lex (void) case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': a=0.0; - do { a=10.0*a+(current-'0'); save_and_next(); } while (isdigit(current)); + do { + a=10.0*a+(current-'0'); + save_and_next(); + } while (isdigit(current)); if (current == '.') save_and_next(); -fraction: + fraction: { double da=0.1; while (isdigit(current)) - {a+=(current-'0')*da; da/=10.0; save_and_next()}; + { + a+=(current-'0')*da; + da/=10.0; + save_and_next(); + } if (current == 'e' || current == 'E') { int e=0; @@ -310,15 +300,19 @@ fraction: save_and_next(); neg=(current=='-'); if (current == '+' || current == '-') save_and_next(); - if (!isdigit(current)) return WRONGTOKEN; - do { e=10.0*e+(current-'0'); save_and_next(); } while (isdigit(current)); - for (ea=neg?0.1:10.0; e>0; e>>=1) + if (!isdigit(current)) { save(0); return WRONGTOKEN; } + do { + e=10.0*e+(current-'0'); + save_and_next(); + } while (isdigit(current)); + for (ea=neg?0.1:10.0; e>0; e>>=1) { if (e & 1) a*=ea; ea*=ea; } } luaY_lval.vFloat = a; + save(0); return NUMBER; } @@ -330,3 +324,4 @@ fraction: } } } +