Lines Matching defs:ls

24 #define next(ls) (ls->current = zgetc(ls->z))
28 #define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r')
42 #define save_and_next(ls) (save(ls, ls->current), next(ls))
45 static l_noret lexerror (LexState *ls, const char *msg, int token);
48 static void save (LexState *ls, int c) {
49 Mbuffer *b = ls->buff;
53 lexerror(ls, "lexical element too long", 0);
55 luaZ_resizebuffer(ls->L, b, newsize);
71 const char *luaX_token2str (LexState *ls, int token) {
74 return (lisprint(token)) ? luaO_pushfstring(ls->L, LUA_QL("%c"), token) :
75 luaO_pushfstring(ls->L, "char(%d)", token);
80 return luaO_pushfstring(ls->L, LUA_QS, s);
87 static const char *txtToken (LexState *ls, int token) {
92 save(ls, '\0');
93 return luaO_pushfstring(ls->L, LUA_QS, luaZ_buffer(ls->buff));
95 return luaX_token2str(ls, token);
100 static l_noret lexerror (LexState *ls, const char *msg, int token) {
102 luaO_chunkid(buff, getstr(ls->source), LUA_IDSIZE);
103 msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg);
105 luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token));
106 luaD_throw(ls->L, LUA_ERRSYNTAX);
110 l_noret luaX_syntaxerror (LexState *ls, const char *msg) {
111 lexerror(ls, msg, ls->t.token);
120 TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
121 lua_State *L = ls->L;
125 o = luaH_set(L, ls->fs->h, L->top - 1);
144 static void inclinenumber (LexState *ls) {
145 int old = ls->current;
146 lua_assert(currIsNewline(ls));
147 next(ls); /* skip `\n' or `\r' */
148 if (currIsNewline(ls) && ls->current != old)
149 next(ls); /* skip `\n\r' or `\r\n' */
150 if (++ls->linenumber >= MAX_INT)
151 lexerror(ls, "chunk has too many lines", 0);
155 void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source,
157 ls->decpoint = '.';
158 ls->L = L;
159 ls->current = firstchar;
160 ls->lookahead.token = TK_EOS; /* no look-ahead token */
161 ls->z = z;
162 ls->fs = NULL;
163 ls->linenumber = 1;
164 ls->lastline = 1;
165 ls->source = source;
166 ls->envn = luaS_new(L, LUA_ENV); /* create env name */
167 luaS_fix(ls->envn); /* never collect this name */
168 luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */
181 static int check_next (LexState *ls, const char *set) {
182 if (ls->current == '\0' || !strchr(set, ls->current))
184 save_and_next(ls);
192 static void buffreplace (LexState *ls, char from, char to) {
193 size_t n = luaZ_bufflen(ls->buff);
194 char *p = luaZ_buffer(ls->buff);
211 static void trydecpoint (LexState *ls, SemInfo *seminfo) {
212 char old = ls->decpoint;
213 ls->decpoint = getlocaledecpoint();
214 buffreplace(ls, old, ls->decpoint); /* try new decimal separator */
215 if (!buff2d(ls->buff, &seminfo->r)) {
217 buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */
218 lexerror(ls, "malformed number", TK_NUMBER);
228 static void read_numeral (LexState *ls, SemInfo *seminfo) {
230 int first = ls->current;
231 lua_assert(lisdigit(ls->current));
232 save_and_next(ls);
233 if (first == '0' && check_next(ls, "Xx")) /* hexadecimal? */
236 if (check_next(ls, expo)) /* exponent part? */
237 (void) check_next(ls, "+-"); /* optional exponent sign */
238 if (lisxdigit(ls->current) || ls->current == '.')
239 save_and_next(ls);
242 save(ls, '\0');
243 buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */
244 if (!buff2d(ls->buff, &seminfo->r)) /* format error? */
245 trydecpoint(ls, seminfo); /* try to update decimal point separator */
253 static int skip_sep (LexState *ls) {
255 int s = ls->current;
257 save_and_next(ls);
258 while (ls->current == '=') {
259 save_and_next(ls);
262 return (ls->current == s) ? count : (-count) - 1;
266 static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
267 save_and_next(ls); /* skip 2nd `[' */
268 if (currIsNewline(ls)) /* string starts with a newline? */
269 inclinenumber(ls); /* skip it */
271 switch (ls->current) {
273 lexerror(ls, (seminfo) ? "unfinished long string" :
277 if (skip_sep(ls) == sep) {
278 save_and_next(ls); /* skip 2nd `]' */
284 save(ls, '\n');
285 inclinenumber(ls);
286 if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */
290 if (seminfo) save_and_next(ls);
291 else next(ls);
296 seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep),
297 luaZ_bufflen(ls->buff) - 2*(2 + sep));
301 static void escerror (LexState *ls, int *c, int n, const char *msg) {
303 luaZ_resetbuffer(ls->buff); /* prepare error message */
304 save(ls, '\\');
306 save(ls, c[i]);
307 lexerror(ls, msg, TK_STRING);
311 static int readhexaesc (LexState *ls) {
316 c[i] = next(ls);
318 escerror(ls, c, i + 1, "hexadecimal digit expected");
325 static int readdecesc (LexState *ls) {
328 for (i = 0; i < 3 && lisdigit(ls->current); i++) { /* read up to 3 digits */
329 c[i] = ls->current;
331 next(ls);
334 escerror(ls, c, i, "decimal escape too large");
339 static void read_string (LexState *ls, int del, SemInfo *seminfo) {
340 save_and_next(ls); /* keep delimiter (for error messages) */
341 while (ls->current != del) {
342 switch (ls->current) {
344 lexerror(ls, "unfinished string", TK_EOS);
348 lexerror(ls, "unfinished string", TK_STRING);
352 next(ls); /* do not save the `\' */
353 switch (ls->current) {
361 case 'x': c = readhexaesc(ls); goto read_save;
363 inclinenumber(ls); c = '\n'; goto only_save;
365 c = ls->current; goto read_save;
368 next(ls); /* skip the 'z' */
369 while (lisspace(ls->current)) {
370 if (currIsNewline(ls)) inclinenumber(ls);
371 else next(ls);
376 if (!lisdigit(ls->current))
377 escerror(ls, &ls->current, 1, "invalid escape sequence");
379 c = readdecesc(ls);
383 read_save: next(ls); /* read next character */
384 only_save: save(ls, c); /* save 'c' */
388 save_and_next(ls);
391 save_and_next(ls); /* skip delimiter */
392 seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1,
393 luaZ_bufflen(ls->buff) - 2);
397 static int llex (LexState *ls, SemInfo *seminfo) {
398 luaZ_resetbuffer(ls->buff);
400 switch (ls->current) {
402 inclinenumber(ls);
406 next(ls);
410 next(ls);
411 if (ls->current != '-') return '-';
413 next(ls);
414 if (ls->current == '[') { /* long comment? */
415 int sep = skip_sep(ls);
416 luaZ_resetbuffer(ls->buff); /* `skip_sep' may dirty the buffer */
418 read_long_string(ls, NULL, sep); /* skip long comment */
419 luaZ_resetbuffer(ls->buff); /* previous call may dirty the buff. */
424 while (!currIsNewline(ls) && ls->current != EOZ)
425 next(ls); /* skip until end of line (or end of file) */
429 int sep = skip_sep(ls);
431 read_long_string(ls, seminfo, sep);
436 lexerror(ls, "invalid long string delimiter", TK_STRING);
441 next(ls);
442 if (ls->current != '=') return '=';
443 else { next(ls); return TK_EQ; }
446 next(ls);
447 if (ls->current != '=') return '<';
448 else { next(ls); return TK_LE; }
451 next(ls);
452 if (ls->current != '=') return '>';
453 else { next(ls); return TK_GE; }
456 next(ls);
457 if (ls->current != '=') return '~';
458 else { next(ls); return TK_NE; }
461 next(ls);
462 if (ls->current != ':') return ':';
463 else { next(ls); return TK_DBCOLON; }
466 read_string(ls, ls->current, seminfo);
470 save_and_next(ls);
471 if (check_next(ls, ".")) {
472 if (check_next(ls, "."))
476 else if (!lisdigit(ls->current)) return '.';
482 read_numeral(ls, seminfo);
489 if (lislalpha(ls->current)) { /* identifier or reserved word? */
492 save_and_next(ls);
493 } while (lislalnum(ls->current));
494 ts = luaX_newstring(ls, luaZ_buffer(ls->buff),
495 luaZ_bufflen(ls->buff));
504 int c = ls->current;
505 next(ls);
514 void luaX_next (LexState *ls) {
515 ls->lastline = ls->linenumber;
516 if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */
517 ls->t = ls->lookahead; /* use this one */
518 ls->lookahead.token = TK_EOS; /* and discharge it */
521 ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */
525 int luaX_lookahead (LexState *ls) {
526 lua_assert(ls->lookahead.token == TK_EOS);
527 ls->lookahead.token = llex(ls, &ls->lookahead.seminfo);
528 return ls->lookahead.token;