commit 5cddb264d430d7c9b4defd63d823d98bf002f4d1
parent 9863223fbf512d903a1677c861e4beb4f8feda4d
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Thu, 30 May 1996 11:03:47 -0300
lexical analiser may use luaI_buffer, instead of waste space with
a separate buffer.
Diffstat:
M | lex.c | | | 143 | ++++++++++++++++++++++++++++++++++++++----------------------------------------- |
1 file changed, 69 insertions(+), 74 deletions(-)
diff --git 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 <ctype.h>
#include <string.h>
@@ -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 int current; /* look ahead character */
+static Input input; /* input function */
-static Input input;
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:
}
}
}
+