aboutsummaryrefslogtreecommitdiff
path: root/llex.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-08-27 18:01:44 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-08-27 18:01:44 -0300
commit8332d5c8a5059b85da1adaa3f0197d0f57afae81 (patch)
tree8a2f59ff0803da3afbc7e8a409911c920d624e94 /llex.c
parent885961be1d8e3f703b54d1d19e6c63617cd2ed24 (diff)
downloadlua-8332d5c8a5059b85da1adaa3f0197d0f57afae81.tar.gz
lua-8332d5c8a5059b85da1adaa3f0197d0f57afae81.tar.bz2
lua-8332d5c8a5059b85da1adaa3f0197d0f57afae81.zip
parser fully reentrant(!)
Diffstat (limited to 'llex.c')
-rw-r--r--llex.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/llex.c b/llex.c
index 217194b6..e7b20a46 100644
--- a/llex.c
+++ b/llex.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: llex.c,v 1.120 2003/05/15 12:20:24 roberto Exp roberto $ 2** $Id: llex.c,v 1.121 2003/08/21 14:16:43 roberto Exp roberto $
3** Lexical Analyzer 3** Lexical Analyzer
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -111,6 +111,16 @@ static void luaX_lexerror (LexState *ls, const char *s, int token) {
111} 111}
112 112
113 113
114TString *luaX_newstring (LexState *LS, const char *str, size_t l) {
115 lua_State *L = LS->L;
116 TString *ts = luaS_newlstr(L, str, l);
117 TObject *o = luaH_setstr(L, LS->fs->h, ts); /* entry for `str' */
118 if (ttisnil(o))
119 setbvalue(o, 1); /* make sure `str' will not be collected */
120 return ts;
121}
122
123
114static void inclinenumber (LexState *LS) { 124static void inclinenumber (LexState *LS) {
115 int old = LS->current; 125 int old = LS->current;
116 lua_assert(nextIsNewline(LS)); 126 lua_assert(nextIsNewline(LS));
@@ -253,7 +263,7 @@ static void read_long_string (LexState *LS, SemInfo *seminfo) {
253 save_and_next(LS, l); /* skip the second `]' */ 263 save_and_next(LS, l); /* skip the second `]' */
254 save(LS, '\0', l); 264 save(LS, '\0', l);
255 if (seminfo) 265 if (seminfo)
256 seminfo->ts = luaS_newlstr(LS->L, luaZ_buffer(LS->buff) + 2, l - 5); 266 seminfo->ts = luaX_newstring(LS, luaZ_buffer(LS->buff) + 2, l - 5);
257} 267}
258 268
259 269
@@ -311,7 +321,7 @@ static void read_string (LexState *LS, int del, SemInfo *seminfo) {
311 } 321 }
312 save_and_next(LS, l); /* skip delimiter */ 322 save_and_next(LS, l); /* skip delimiter */
313 save(LS, '\0', l); 323 save(LS, '\0', l);
314 seminfo->ts = luaS_newlstr(LS->L, luaZ_buffer(LS->buff) + 1, l - 3); 324 seminfo->ts = luaX_newstring(LS, luaZ_buffer(LS->buff) + 1, l - 3);
315} 325}
316 326
317 327
@@ -401,7 +411,7 @@ int luaX_lex (LexState *LS, SemInfo *seminfo) {
401 else if (isalpha(LS->current) || LS->current == '_') { 411 else if (isalpha(LS->current) || LS->current == '_') {
402 /* identifier or reserved word */ 412 /* identifier or reserved word */
403 size_t l = readname(LS); 413 size_t l = readname(LS);
404 TString *ts = luaS_newlstr(LS->L, luaZ_buffer(LS->buff), l); 414 TString *ts = luaX_newstring(LS, luaZ_buffer(LS->buff), l);
405 if (ts->tsv.reserved > 0) /* reserved word? */ 415 if (ts->tsv.reserved > 0) /* reserved word? */
406 return ts->tsv.reserved - 1 + FIRST_RESERVED; 416 return ts->tsv.reserved - 1 + FIRST_RESERVED;
407 seminfo->ts = ts; 417 seminfo->ts = ts;