Lines Matching refs:ls

36 #define next(ls)	(ls->current = zgetc(ls->z))  argument
40 #define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') argument
55 #define save_and_next(ls) (save(ls, ls->current), next(ls)) argument
58 static l_noret lexerror (LexState *ls, const char *msg, int token);
61 static void save (LexState *ls, int c) { in save() argument
62 Mbuffer *b = ls->buff; in save()
66 lexerror(ls, "lexical element too long", 0); in save()
68 luaZ_resizebuffer(ls->L, b, newsize); in save()
86 const char *luaX_token2str (LexState *ls, int token) { in luaX_token2str() argument
89 return luaO_pushfstring(ls->L, "'%c'", token); in luaX_token2str()
91 return luaO_pushfstring(ls->L, "'<\\%d>'", token); in luaX_token2str()
96 return luaO_pushfstring(ls->L, "'%s'", s); in luaX_token2str()
103 static const char *txtToken (LexState *ls, int token) { in txtToken() argument
111 save(ls, '\0'); in txtToken()
112 return luaO_pushfstring(ls->L, "'%s'", luaZ_buffer(ls->buff)); in txtToken()
114 return luaX_token2str(ls, token); in txtToken()
119 static l_noret lexerror (LexState *ls, const char *msg, int token) { in lexerror() argument
120 msg = luaG_addinfo(ls->L, msg, ls->source, ls->linenumber); in lexerror()
122 luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token)); in lexerror()
123 luaD_throw(ls->L, LUA_ERRSYNTAX); in lexerror()
127 l_noret luaX_syntaxerror (LexState *ls, const char *msg) { in luaX_syntaxerror() argument
128 lexerror(ls, msg, ls->t.token); in luaX_syntaxerror()
142 TString *luaX_newstring (LexState *ls, const char *str, size_t l) { in luaX_newstring() argument
143 lua_State *L = ls->L; in luaX_newstring()
145 const TValue *o = luaH_getstr(ls->h, ts); in luaX_newstring()
151 luaH_finishset(L, ls->h, stv, o, stv); /* t[string] = string */ in luaX_newstring()
164 static void inclinenumber (LexState *ls) { in inclinenumber() argument
165 int old = ls->current; in inclinenumber()
166 lua_assert(currIsNewline(ls)); in inclinenumber()
167 next(ls); /* skip '\n' or '\r' */ in inclinenumber()
168 if (currIsNewline(ls) && ls->current != old) in inclinenumber()
169 next(ls); /* skip '\n\r' or '\r\n' */ in inclinenumber()
170 if (++ls->linenumber >= MAX_INT) in inclinenumber()
171 lexerror(ls, "chunk has too many lines", 0); in inclinenumber()
175 void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source, in luaX_setinput() argument
177 ls->t.token = 0; in luaX_setinput()
178 ls->L = L; in luaX_setinput()
179 ls->current = firstchar; in luaX_setinput()
180 ls->lookahead.token = TK_EOS; /* no look-ahead token */ in luaX_setinput()
181 ls->z = z; in luaX_setinput()
182 ls->fs = NULL; in luaX_setinput()
183 ls->linenumber = 1; in luaX_setinput()
184 ls->lastline = 1; in luaX_setinput()
185 ls->source = source; in luaX_setinput()
186 ls->envn = luaS_newliteral(L, LUA_ENV); /* get env name */ in luaX_setinput()
187 luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ in luaX_setinput()
199 static int check_next1 (LexState *ls, int c) { in check_next1() argument
200 if (ls->current == c) { in check_next1()
201 next(ls); in check_next1()
212 static int check_next2 (LexState *ls, const char *set) { in check_next2() argument
214 if (ls->current == set[0] || ls->current == set[1]) { in check_next2()
215 save_and_next(ls); in check_next2()
236 static int read_numeral (LexState *ls, SemInfo *seminfo) { in read_numeral() argument
239 int first = ls->current; in read_numeral()
240 lua_assert(lisdigit(ls->current)); in read_numeral()
241 save_and_next(ls); in read_numeral()
242 if (first == '0' && check_next2(ls, "xX")) /* hexadecimal? */ in read_numeral()
245 if (check_next2(ls, expo)) /* exponent mark? */ in read_numeral()
246 check_next2(ls, "-+"); /* optional exponent sign */ in read_numeral()
247 else if (lisxdigit(ls->current) || ls->current == '.') /* '%x|%.' */ in read_numeral()
248 save_and_next(ls); in read_numeral()
251 if (lislalpha(ls->current)) /* is numeral touching a letter? */ in read_numeral()
252 save_and_next(ls); /* force an error */ in read_numeral()
253 save(ls, '\0'); in read_numeral()
254 if (luaO_str2num(luaZ_buffer(ls->buff), &obj) == 0) /* format error? */ in read_numeral()
255 lexerror(ls, "malformed number", TK_FLT); in read_numeral()
269 static int read_numeral (LexState *ls, SemInfo *seminfo) { in read_numeral() argument
271 int first = ls->current; in read_numeral()
272 lua_assert(lisdigit(ls->current)); in read_numeral()
273 save_and_next(ls); in read_numeral()
275 check_next2(ls, "xX"); /* hexadecimal? */ in read_numeral()
277 if (lisxdigit(ls->current)) in read_numeral()
278 save_and_next(ls); in read_numeral()
281 save(ls, '\0'); in read_numeral()
282 if (luaO_str2num(luaZ_buffer(ls->buff), &obj) == 0) /* format error? */ in read_numeral()
283 lexerror(ls, "malformed number", TK_INT); in read_numeral()
296 static size_t skip_sep (LexState *ls) { in skip_sep() argument
298 int s = ls->current; in skip_sep()
300 save_and_next(ls); in skip_sep()
301 while (ls->current == '=') { in skip_sep()
302 save_and_next(ls); in skip_sep()
305 return (ls->current == s) ? count + 2 in skip_sep()
311 static void read_long_string (LexState *ls, SemInfo *seminfo, size_t sep) { in read_long_string() argument
312 int line = ls->linenumber; /* initial line (for error message) */ in read_long_string()
313 save_and_next(ls); /* skip 2nd '[' */ in read_long_string()
314 if (currIsNewline(ls)) /* string starts with a newline? */ in read_long_string()
315 inclinenumber(ls); /* skip it */ in read_long_string()
317 switch (ls->current) { in read_long_string()
320 const char *msg = luaO_pushfstring(ls->L, in read_long_string()
322 lexerror(ls, msg, TK_EOS); in read_long_string()
326 if (skip_sep(ls) == sep) { in read_long_string()
327 save_and_next(ls); /* skip 2nd ']' */ in read_long_string()
333 save(ls, '\n'); in read_long_string()
334 inclinenumber(ls); in read_long_string()
335 if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ in read_long_string()
339 if (seminfo) save_and_next(ls); in read_long_string()
340 else next(ls); in read_long_string()
345 seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + sep, in read_long_string()
346 luaZ_bufflen(ls->buff) - 2 * sep); in read_long_string()
350 static void esccheck (LexState *ls, int c, const char *msg) { in esccheck() argument
352 if (ls->current != EOZ) in esccheck()
353 save_and_next(ls); /* add current to buffer for error message */ in esccheck()
354 lexerror(ls, msg, TK_STRING); in esccheck()
359 static int gethexa (LexState *ls) { in gethexa() argument
360 save_and_next(ls); in gethexa()
361 esccheck (ls, lisxdigit(ls->current), "hexadecimal digit expected"); in gethexa()
362 return luaO_hexavalue(ls->current); in gethexa()
366 static int readhexaesc (LexState *ls) { in readhexaesc() argument
367 int r = gethexa(ls); in readhexaesc()
368 r = (r << 4) + gethexa(ls); in readhexaesc()
369 luaZ_buffremove(ls->buff, 2); /* remove saved chars from buffer */ in readhexaesc()
374 static unsigned long readutf8esc (LexState *ls) { in readutf8esc() argument
377 save_and_next(ls); /* skip 'u' */ in readutf8esc()
378 esccheck(ls, ls->current == '{', "missing '{'"); in readutf8esc()
379 r = gethexa(ls); /* must have at least one digit */ in readutf8esc()
380 while (cast_void(save_and_next(ls)), lisxdigit(ls->current)) { in readutf8esc()
382 esccheck(ls, r <= (0x7FFFFFFFu >> 4), "UTF-8 value too large"); in readutf8esc()
383 r = (r << 4) + luaO_hexavalue(ls->current); in readutf8esc()
385 esccheck(ls, ls->current == '}', "missing '}'"); in readutf8esc()
386 next(ls); /* skip '}' */ in readutf8esc()
387 luaZ_buffremove(ls->buff, i); /* remove saved chars from buffer */ in readutf8esc()
392 static void utf8esc (LexState *ls) { in utf8esc() argument
394 int n = luaO_utf8esc(buff, readutf8esc(ls)); in utf8esc()
396 save(ls, buff[UTF8BUFFSZ - n]); in utf8esc()
400 static int readdecesc (LexState *ls) { in readdecesc() argument
403 for (i = 0; i < 3 && lisdigit(ls->current); i++) { /* read up to 3 digits */ in readdecesc()
404 r = 10*r + ls->current - '0'; in readdecesc()
405 save_and_next(ls); in readdecesc()
407 esccheck(ls, r <= UCHAR_MAX, "decimal escape too large"); in readdecesc()
408 luaZ_buffremove(ls->buff, i); /* remove read digits from buffer */ in readdecesc()
413 static void read_string (LexState *ls, int del, SemInfo *seminfo) { in read_string() argument
414 save_and_next(ls); /* keep delimiter (for error messages) */ in read_string()
415 while (ls->current != del) { in read_string()
416 switch (ls->current) { in read_string()
418 lexerror(ls, "unfinished string", TK_EOS); in read_string()
422 lexerror(ls, "unfinished string", TK_STRING); in read_string()
426 save_and_next(ls); /* keep '\\' for error messages */ in read_string()
427 switch (ls->current) { in read_string()
435 case 'x': c = readhexaesc(ls); goto read_save; in read_string()
436 case 'u': utf8esc(ls); goto no_save; in read_string()
438 inclinenumber(ls); c = '\n'; goto only_save; in read_string()
440 c = ls->current; goto read_save; in read_string()
443 luaZ_buffremove(ls->buff, 1); /* remove '\\' */ in read_string()
444 next(ls); /* skip the 'z' */ in read_string()
445 while (lisspace(ls->current)) { in read_string()
446 if (currIsNewline(ls)) inclinenumber(ls); in read_string()
447 else next(ls); in read_string()
452 esccheck(ls, lisdigit(ls->current), "invalid escape sequence"); in read_string()
453 c = readdecesc(ls); /* digital escape '\ddd' */ in read_string()
458 next(ls); in read_string()
461 luaZ_buffremove(ls->buff, 1); /* remove '\\' */ in read_string()
462 save(ls, c); in read_string()
467 save_and_next(ls); in read_string()
470 save_and_next(ls); /* skip delimiter */ in read_string()
471 seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, in read_string()
472 luaZ_bufflen(ls->buff) - 2); in read_string()
476 static int llex (LexState *ls, SemInfo *seminfo) { in llex() argument
477 luaZ_resetbuffer(ls->buff); in llex()
479 switch (ls->current) { in llex()
481 inclinenumber(ls); in llex()
485 next(ls); in llex()
489 next(ls); in llex()
490 if (ls->current != '-') return '-'; in llex()
492 next(ls); in llex()
493 if (ls->current == '[') { /* long comment? */ in llex()
494 size_t sep = skip_sep(ls); in llex()
495 luaZ_resetbuffer(ls->buff); /* 'skip_sep' may dirty the buffer */ in llex()
497 read_long_string(ls, NULL, sep); /* skip long comment */ in llex()
498 luaZ_resetbuffer(ls->buff); /* previous call may dirty the buff. */ in llex()
503 while (!currIsNewline(ls) && ls->current != EOZ) in llex()
504 next(ls); /* skip until end of line (or end of file) */ in llex()
508 size_t sep = skip_sep(ls); in llex()
510 read_long_string(ls, seminfo, sep); in llex()
514 lexerror(ls, "invalid long string delimiter", TK_STRING); in llex()
518 next(ls); in llex()
519 if (check_next1(ls, '=')) return TK_EQ; /* '==' */ in llex()
523 next(ls); in llex()
524 if (check_next1(ls, '=')) return TK_LE; /* '<=' */ in llex()
525 else if (check_next1(ls, '<')) return TK_SHL; /* '<<' */ in llex()
529 next(ls); in llex()
530 if (check_next1(ls, '=')) return TK_GE; /* '>=' */ in llex()
531 else if (check_next1(ls, '>')) return TK_SHR; /* '>>' */ in llex()
535 next(ls); in llex()
536 if (check_next1(ls, '/')) return TK_IDIV; /* '//' */ in llex()
540 next(ls); in llex()
541 if (check_next1(ls, '=')) return TK_NE; /* '~=' */ in llex()
545 next(ls); in llex()
546 if (check_next1(ls, ':')) return TK_DBCOLON; /* '::' */ in llex()
550 read_string(ls, ls->current, seminfo); in llex()
554 save_and_next(ls); in llex()
555 if (check_next1(ls, '.')) { in llex()
556 if (check_next1(ls, '.')) in llex()
561 else if (!lisdigit(ls->current)) return '.'; in llex()
562 else return read_numeral(ls, seminfo); in llex()
569 return read_numeral(ls, seminfo); in llex()
575 if (lislalpha(ls->current)) { /* identifier or reserved word? */ in llex()
578 save_and_next(ls); in llex()
579 } while (lislalnum(ls->current)); in llex()
580 ts = luaX_newstring(ls, luaZ_buffer(ls->buff), in llex()
581 luaZ_bufflen(ls->buff)); in llex()
590 int c = ls->current; in llex()
591 next(ls); in llex()
600 void luaX_next (LexState *ls) { in luaX_next() argument
601 ls->lastline = ls->linenumber; in luaX_next()
602 if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ in luaX_next()
603 ls->t = ls->lookahead; /* use this one */ in luaX_next()
604 ls->lookahead.token = TK_EOS; /* and discharge it */ in luaX_next()
607 ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ in luaX_next()
611 int luaX_lookahead (LexState *ls) { in luaX_lookahead() argument
612 lua_assert(ls->lookahead.token == TK_EOS); in luaX_lookahead()
613 ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); in luaX_lookahead()
614 return ls->lookahead.token; in luaX_lookahead()