summaryrefslogtreecommitdiff
path: root/lex.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1996-02-14 10:35:51 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1996-02-14 10:35:51 -0300
commitd1608c597e2f45021d43c56050aff08e5d417699 (patch)
treee6b0a07e68384cd9707e7dda6864dd8664e2ee99 /lex.c
parent0f4903a5d79fb594115c5603072d0dce77b2b84e (diff)
downloadlua-d1608c597e2f45021d43c56050aff08e5d417699.tar.gz
lua-d1608c597e2f45021d43c56050aff08e5d417699.tar.bz2
lua-d1608c597e2f45021d43c56050aff08e5d417699.zip
reserved words are stored in main string table; "marked" field is
used to indicate its type. Table initializations centralized by "tree.c".
Diffstat (limited to 'lex.c')
-rw-r--r--lex.c31
1 files changed, 12 insertions, 19 deletions
diff --git a/lex.c b/lex.c
index c65d2253..d883fcb9 100644
--- a/lex.c
+++ b/lex.c
@@ -1,4 +1,4 @@
1char *rcs_lex = "$Id: lex.c,v 2.25 1996/02/12 18:32:40 roberto Exp roberto $"; 1char *rcs_lex = "$Id: lex.c,v 2.26 1996/02/13 17:30:39 roberto Exp roberto $";
2 2
3 3
4#include <ctype.h> 4#include <ctype.h>
@@ -47,7 +47,6 @@ char *lua_lasttext (void)
47} 47}
48 48
49 49
50/* The reserved words must be listed in lexicographic order */
51static struct 50static struct
52 { 51 {
53 char *name; 52 char *name;
@@ -74,22 +73,14 @@ static struct
74#define RESERVEDSIZE (sizeof(reserved)/sizeof(reserved[0])) 73#define RESERVEDSIZE (sizeof(reserved)/sizeof(reserved[0]))
75 74
76 75
77static int findReserved (char *name) 76void luaI_addReserved (void)
78{ 77{
79 int l = 0; 78 int i;
80 int h = RESERVEDSIZE - 1; 79 for (i=0; i<RESERVEDSIZE; i++)
81 while (l <= h)
82 { 80 {
83 int m = (l+h)/2; 81 TaggedString *ts = lua_createstring(reserved[i].name);
84 int comp = lua_strcmp(name, reserved[m].name); 82 ts->marked = reserved[i].token; /* reserved word (always > 255) */
85 if (comp < 0)
86 h = m-1;
87 else if (comp == 0)
88 return reserved[m].token;
89 else
90 l = m+1;
91 } 83 }
92 return 0;
93} 84}
94 85
95 86
@@ -282,12 +273,14 @@ int luaY_lex (void)
282 case 'Z': 273 case 'Z':
283 case '_': 274 case '_':
284 { 275 {
285 Word res; 276 TaggedString *ts;
286 do { save_and_next(); } while (isalnum(current) || current == '_'); 277 do { save_and_next(); } while (isalnum(current) || current == '_');
287 *yytextLast = 0; 278 *yytextLast = 0;
288 res = findReserved(yytext); 279 ts = lua_createstring(yytext);
289 if (res) return res; 280 if (ts->marked > 2)
290 luaY_lval.pTStr = luaI_createfixedstring(yytext); 281 return ts->marked; /* reserved word */
282 luaY_lval.pTStr = ts;
283 ts->marked = 2; /* avoid GC */
291 return NAME; 284 return NAME;
292 } 285 }
293 286