32#define next(ls) (ls->current = zgetc(ls->z))
36#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r')
40static const char *
const luaX_tokens [] = {
41 "and",
"break",
"do",
"else",
"elseif",
42 "end",
"false",
"for",
"function",
"goto",
"if",
43 "in",
"local",
"nil",
"not",
"or",
"repeat",
44 "return",
"then",
"true",
"until",
"while",
45 "//",
"..",
"...",
"==",
">=",
"<=",
"~=",
46 "<<",
">>",
"::",
"<eof>",
47 "<number>",
"<integer>",
"<name>",
"<string>"
51#define save_and_next(ls) (save(ls, ls->current), next(ls))
54static l_noret lexerror (
LexState *ls,
const char *msg,
int token);
57static void save (
LexState *ls,
int c) {
59 if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) {
61 if (luaZ_sizebuffer(b) >= MAX_SIZE/2)
62 lexerror(ls,
"lexical element too long", 0);
63 newsize = luaZ_sizebuffer(b) * 2;
64 luaZ_resizebuffer(ls->L, b, newsize);
66 b->buffer[luaZ_bufflen(b)++] = cast_char(c);
72 TString *e = luaS_newliteral(L, LUA_ENV);
73 luaC_fix(L, obj2gco(e));
74 for (i=0; i<NUM_RESERVED; i++) {
75 TString *ts = luaS_new(L, luaX_tokens[i]);
76 luaC_fix(L, obj2gco(ts));
77 ts->extra = cast_byte(i+1);
82const char *luaX_token2str (
LexState *ls,
int token) {
83 if (token < FIRST_RESERVED) {
85 return luaO_pushfstring(ls->L,
"'%c'", token);
87 return luaO_pushfstring(ls->L,
"'<\\%d>'", token);
90 const char *s = luaX_tokens[token - FIRST_RESERVED];
92 return luaO_pushfstring(ls->L,
"'%s'", s);
99static const char *txtToken (
LexState *ls,
int token) {
101 case TK_NAME:
case TK_STRING:
102 case TK_FLT:
case TK_INT:
104 return luaO_pushfstring(ls->L,
"'%s'", luaZ_buffer(ls->buff));
106 return luaX_token2str(ls, token);
111static l_noret lexerror (
LexState *ls,
const char *msg,
int token) {
112 msg = luaG_addinfo(ls->L, msg, ls->source, ls->linenumber);
114 luaO_pushfstring(ls->L,
"%s near %s", msg, txtToken(ls, token));
115 luaD_throw(ls->L, LUA_ERRSYNTAX);
119l_noret luaX_syntaxerror (
LexState *ls,
const char *msg) {
120 lexerror(ls, msg, ls->t.token);
136 TString *ts = luaS_newlstr(L, str, l);
137 const TValue *o = luaH_getstr(ls->h, ts);
139 ts = keystrval(nodefromval(o));
141 TValue *stv = s2v(L->top.p++);
142 setsvalue(L, stv, ts);
143 luaH_finishset(L, ls->h, stv, o, stv);
156static void inclinenumber (
LexState *ls) {
157 int old = ls->current;
158 lua_assert(currIsNewline(ls));
160 if (currIsNewline(ls) && ls->current != old)
162 if (++ls->linenumber >= MAX_INT)
163 lexerror(ls,
"chunk has too many lines", 0);
171 ls->current = firstchar;
172 ls->lookahead.token = TK_EOS;
178 ls->envn = luaS_newliteral(L, LUA_ENV);
179 luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER);
191static int check_next1 (
LexState *ls,
int c) {
192 if (ls->current == c) {
204static int check_next2 (
LexState *ls,
const char *set) {
205 lua_assert(set[2] ==
'\0');
206 if (ls->current == set[0] || ls->current == set[1]) {
229 const char *expo =
"Ee";
230 int first = ls->current;
231 lua_assert(lisdigit(ls->current));
233 if (first ==
'0' && check_next2(ls,
"xX"))
236 if (check_next2(ls, expo))
237 check_next2(ls,
"-+");
238 else if (lisxdigit(ls->current) || ls->current ==
'.')
242 if (lislalpha(ls->current))
245 if (luaO_str2num(luaZ_buffer(ls->buff), &obj) == 0)
246 lexerror(ls,
"malformed number", TK_FLT);
247 if (ttisinteger(&obj)) {
248 seminfo->i = ivalue(&obj);
252 lua_assert(ttisfloat(&obj));
253 seminfo->r = fltvalue(&obj);
265static size_t skip_sep (
LexState *ls) {
268 lua_assert(s ==
'[' || s ==
']');
270 while (ls->current ==
'=') {
274 return (ls->current == s) ? count + 2
280static void read_long_string (
LexState *ls,
SemInfo *seminfo,
size_t sep) {
281 int line = ls->linenumber;
283 if (currIsNewline(ls))
286 switch (ls->current) {
288 const char *what = (seminfo ?
"string" :
"comment");
289 const char *msg = luaO_pushfstring(ls->L,
290 "unfinished long %s (starting at line %d)", what, line);
291 lexerror(ls, msg, TK_EOS);
295 if (skip_sep(ls) == sep) {
301 case '\n':
case '\r': {
304 if (!seminfo) luaZ_resetbuffer(ls->buff);
308 if (seminfo) save_and_next(ls);
314 seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + sep,
315 luaZ_bufflen(ls->buff) - 2 * sep);
319static void esccheck (
LexState *ls,
int c,
const char *msg) {
321 if (ls->current != EOZ)
323 lexerror(ls, msg, TK_STRING);
330 esccheck (ls, lisxdigit(ls->current),
"hexadecimal digit expected");
331 return luaO_hexavalue(ls->current);
335static int readhexaesc (
LexState *ls) {
337 r = (r << 4) + gethexa(ls);
338 luaZ_buffremove(ls->buff, 2);
343static unsigned long readutf8esc (
LexState *ls) {
347 esccheck(ls, ls->current ==
'{',
"missing '{'");
349 while (cast_void(save_and_next(ls)), lisxdigit(ls->current)) {
351 esccheck(ls, r <= (0x7FFFFFFFu >> 4),
"UTF-8 value too large");
352 r = (r << 4) + luaO_hexavalue(ls->current);
354 esccheck(ls, ls->current ==
'}',
"missing '}'");
356 luaZ_buffremove(ls->buff, i);
362 char buff[UTF8BUFFSZ];
363 int n = luaO_utf8esc(buff, readutf8esc(ls));
365 save(ls, buff[UTF8BUFFSZ - n]);
369static int readdecesc (
LexState *ls) {
372 for (i = 0; i < 3 && lisdigit(ls->current); i++) {
373 r = 10*r + ls->current -
'0';
376 esccheck(ls, r <= UCHAR_MAX,
"decimal escape too large");
377 luaZ_buffremove(ls->buff, i);
384 while (ls->current != del) {
385 switch (ls->current) {
387 lexerror(ls,
"unfinished string", TK_EOS);
391 lexerror(ls,
"unfinished string", TK_STRING);
396 switch (ls->current) {
397 case 'a': c =
'\a';
goto read_save;
398 case 'b': c =
'\b';
goto read_save;
399 case 'f': c =
'\f';
goto read_save;
400 case 'n': c =
'\n';
goto read_save;
401 case 'r': c =
'\r';
goto read_save;
402 case 't': c =
'\t';
goto read_save;
403 case 'v': c =
'\v';
goto read_save;
404 case 'x': c = readhexaesc(ls);
goto read_save;
405 case 'u': utf8esc(ls);
goto no_save;
406 case '\n':
case '\r':
407 inclinenumber(ls); c =
'\n';
goto only_save;
408 case '\\':
case '\"':
case '\'':
409 c = ls->current;
goto read_save;
410 case EOZ:
goto no_save;
412 luaZ_buffremove(ls->buff, 1);
414 while (lisspace(ls->current)) {
415 if (currIsNewline(ls)) inclinenumber(ls);
421 esccheck(ls, lisdigit(ls->current),
"invalid escape sequence");
430 luaZ_buffremove(ls->buff, 1);
440 seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1,
441 luaZ_bufflen(ls->buff) - 2);
446 luaZ_resetbuffer(ls->buff);
448 switch (ls->current) {
449 case '\n':
case '\r': {
453 case ' ':
case '\f':
case '\t':
case '\v': {
459 if (ls->current !=
'-')
return '-';
462 if (ls->current ==
'[') {
463 size_t sep = skip_sep(ls);
464 luaZ_resetbuffer(ls->buff);
466 read_long_string(ls, NULL, sep);
467 luaZ_resetbuffer(ls->buff);
472 while (!currIsNewline(ls) && ls->current != EOZ)
477 size_t sep = skip_sep(ls);
479 read_long_string(ls, seminfo, sep);
483 lexerror(ls,
"invalid long string delimiter", TK_STRING);
488 if (check_next1(ls,
'='))
return TK_EQ;
493 if (check_next1(ls,
'='))
return TK_LE;
494 else if (check_next1(ls,
'<'))
return TK_SHL;
499 if (check_next1(ls,
'='))
return TK_GE;
500 else if (check_next1(ls,
'>'))
return TK_SHR;
505 if (check_next1(ls,
'/'))
return TK_IDIV;
510 if (check_next1(ls,
'='))
return TK_NE;
515 if (check_next1(ls,
':'))
return TK_DBCOLON;
518 case '"':
case '\'': {
519 read_string(ls, ls->current, seminfo);
524 if (check_next1(ls,
'.')) {
525 if (check_next1(ls,
'.'))
527 else return TK_CONCAT;
529 else if (!lisdigit(ls->current))
return '.';
530 else return read_numeral(ls, seminfo);
532 case '0':
case '1':
case '2':
case '3':
case '4':
533 case '5':
case '6':
case '7':
case '8':
case '9': {
534 return read_numeral(ls, seminfo);
540 if (lislalpha(ls->current)) {
544 }
while (lislalnum(ls->current));
545 ts = luaX_newstring(ls, luaZ_buffer(ls->buff),
546 luaZ_bufflen(ls->buff));
549 return ts->extra - 1 + FIRST_RESERVED;
566 ls->lastline = ls->linenumber;
567 if (ls->lookahead.token != TK_EOS) {
568 ls->t = ls->lookahead;
569 ls->lookahead.token = TK_EOS;
572 ls->t.token = llex(ls, &ls->t.seminfo);
577 lua_assert(ls->lookahead.token == TK_EOS);
578 ls->lookahead.token = llex(ls, &ls->lookahead.seminfo);
579 return ls->lookahead.token;