Lines Matching refs:ls
28 #define next(ls) (ls->current = zgetc(ls->z)) argument
33 #define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') argument
48 #define save_and_next(ls) (save(ls, ls->current), next(ls)) argument
51 static void save (LexState *ls, int c) { in save() argument
52 Mbuffer *b = ls->buff; in save()
56 luaX_lexerror(ls, "lexical element too long", 0); in save()
58 luaZ_resizebuffer(ls->L, b, newsize); in save()
78 const char *luaX_token2str (LexState *ls, int token) { in luaX_token2str() argument
81 return (iscntrl(token)) ? luaO_pushfstring(ls->L, "char(%d)", token) : in luaX_token2str()
82 luaO_pushfstring(ls->L, "%c", token); in luaX_token2str()
89 static const char *txtToken (LexState *ls, int token) { in txtToken() argument
94 save(ls, '\0'); in txtToken()
95 return luaZ_buffer(ls->buff); in txtToken()
97 return luaX_token2str(ls, token); in txtToken()
102 void luaX_lexerror (LexState *ls, const char *msg, int token) { in luaX_lexerror() argument
104 luaO_chunkid(buff, getstr(ls->source), MAXSRC); in luaX_lexerror()
105 msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg); in luaX_lexerror()
107 luaO_pushfstring(ls->L, "%s near " LUA_QS, msg, txtToken(ls, token)); in luaX_lexerror()
108 luaD_throw(ls->L, LUA_ERRSYNTAX); in luaX_lexerror()
112 void luaX_syntaxerror (LexState *ls, const char *msg) { in luaX_syntaxerror() argument
113 luaX_lexerror(ls, msg, ls->t.token); in luaX_syntaxerror()
117 TString *luaX_newstring (LexState *ls, const char *str, size_t l) { in luaX_newstring() argument
118 lua_State *L = ls->L; in luaX_newstring()
120 TValue *o = luaH_setstr(L, ls->fs->h, ts); /* entry for `str' */ in luaX_newstring()
129 static void inclinenumber (LexState *ls) { in inclinenumber() argument
130 int old = ls->current; in inclinenumber()
131 lua_assert(currIsNewline(ls)); in inclinenumber()
132 next(ls); /* skip `\n' or `\r' */ in inclinenumber()
133 if (currIsNewline(ls) && ls->current != old) in inclinenumber()
134 next(ls); /* skip `\n\r' or `\r\n' */ in inclinenumber()
135 if (++ls->linenumber >= MAX_INT) in inclinenumber()
136 luaX_syntaxerror(ls, "chunk has too many lines"); in inclinenumber()
140 void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) { in luaX_setinput() argument
141 ls->decpoint = '.'; in luaX_setinput()
142 ls->L = L; in luaX_setinput()
143 ls->lookahead.token = TK_EOS; /* no look-ahead token */ in luaX_setinput()
144 ls->z = z; in luaX_setinput()
145 ls->fs = NULL; in luaX_setinput()
146 ls->linenumber = 1; in luaX_setinput()
147 ls->lastline = 1; in luaX_setinput()
148 ls->source = source; in luaX_setinput()
149 luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ in luaX_setinput()
150 next(ls); /* read first char */ in luaX_setinput()
163 static int check_next (LexState *ls, const char *set) { in check_next() argument
164 if (!strchr(set, ls->current)) in check_next()
166 save_and_next(ls); in check_next()
171 static void buffreplace (LexState *ls, char from, char to) { in buffreplace() argument
172 size_t n = luaZ_bufflen(ls->buff); in buffreplace()
173 char *p = luaZ_buffer(ls->buff); in buffreplace()
179 static void trydecpoint (LexState *ls, SemInfo *seminfo) { in trydecpoint() argument
182 char old = ls->decpoint; in trydecpoint()
183 ls->decpoint = (cv ? cv->decimal_point[0] : '.'); in trydecpoint()
184 buffreplace(ls, old, ls->decpoint); /* try updated decimal separator */ in trydecpoint()
185 if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) { in trydecpoint()
187 buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */ in trydecpoint()
188 luaX_lexerror(ls, "malformed number", TK_NUMBER); in trydecpoint()
194 static void read_numeral (LexState *ls, SemInfo *seminfo) { in read_numeral() argument
195 lua_assert(isdigit(ls->current)); in read_numeral()
197 save_and_next(ls); in read_numeral()
198 } while (isdigit(ls->current) || ls->current == '.'); in read_numeral()
199 if (check_next(ls, "Ee")) /* `E'? */ in read_numeral()
200 check_next(ls, "+-"); /* optional exponent sign */ in read_numeral()
201 while (isalnum(ls->current) || ls->current == '_') in read_numeral()
202 save_and_next(ls); in read_numeral()
203 save(ls, '\0'); in read_numeral()
204 buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */ in read_numeral()
205 if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) /* format error? */ in read_numeral()
206 trydecpoint(ls, seminfo); /* try to update decimal point separator */ in read_numeral()
210 static int skip_sep (LexState *ls) { in skip_sep() argument
212 int s = ls->current; in skip_sep()
214 save_and_next(ls); in skip_sep()
215 while (ls->current == '=') { in skip_sep()
216 save_and_next(ls); in skip_sep()
219 return (ls->current == s) ? count : (-count) - 1; in skip_sep()
223 static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) { in read_long_string() argument
226 save_and_next(ls); /* skip 2nd `[' */ in read_long_string()
227 if (currIsNewline(ls)) /* string starts with a newline? */ in read_long_string()
228 inclinenumber(ls); /* skip it */ in read_long_string()
230 switch (ls->current) { in read_long_string()
232 luaX_lexerror(ls, (seminfo) ? "unfinished long string" : in read_long_string()
237 if (skip_sep(ls) == sep) { in read_long_string()
238 save_and_next(ls); /* skip 2nd `[' */ in read_long_string()
242 luaX_lexerror(ls, "nesting of [[...]] is deprecated", '['); in read_long_string()
249 if (skip_sep(ls) == sep) { in read_long_string()
250 save_and_next(ls); /* skip 2nd `]' */ in read_long_string()
261 save(ls, '\n'); in read_long_string()
262 inclinenumber(ls); in read_long_string()
263 if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ in read_long_string()
267 if (seminfo) save_and_next(ls); in read_long_string()
268 else next(ls); in read_long_string()
273 seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep), in read_long_string()
274 luaZ_bufflen(ls->buff) - 2*(2 + sep)); in read_long_string()
278 static void read_string (LexState *ls, int del, SemInfo *seminfo) { in read_string() argument
279 save_and_next(ls); in read_string()
280 while (ls->current != del) { in read_string()
281 switch (ls->current) { in read_string()
283 luaX_lexerror(ls, "unfinished string", TK_EOS); in read_string()
287 luaX_lexerror(ls, "unfinished string", TK_STRING); in read_string()
291 next(ls); /* do not save the `\' */ in read_string()
292 switch (ls->current) { in read_string()
301 case '\r': save(ls, '\n'); inclinenumber(ls); continue; in read_string()
304 if (!isdigit(ls->current)) in read_string()
305 save_and_next(ls); /* handles \\, \", \', and \? */ in read_string()
310 c = 10*c + (ls->current-'0'); in read_string()
311 next(ls); in read_string()
312 } while (++i<3 && isdigit(ls->current)); in read_string()
314 luaX_lexerror(ls, "escape sequence too large", TK_STRING); in read_string()
315 save(ls, c); in read_string()
320 save(ls, c); in read_string()
321 next(ls); in read_string()
325 save_and_next(ls); in read_string()
328 save_and_next(ls); /* skip delimiter */ in read_string()
329 seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, in read_string()
330 luaZ_bufflen(ls->buff) - 2); in read_string()
334 static int llex (LexState *ls, SemInfo *seminfo) { in llex() argument
335 luaZ_resetbuffer(ls->buff); in llex()
337 switch (ls->current) { in llex()
340 inclinenumber(ls); in llex()
344 next(ls); in llex()
345 if (ls->current != '-') return '-'; in llex()
347 next(ls); in llex()
348 if (ls->current == '[') { in llex()
349 int sep = skip_sep(ls); in llex()
350 luaZ_resetbuffer(ls->buff); /* `skip_sep' may dirty the buffer */ in llex()
352 read_long_string(ls, NULL, sep); /* long comment */ in llex()
353 luaZ_resetbuffer(ls->buff); in llex()
358 while (!currIsNewline(ls) && ls->current != EOZ) in llex()
359 next(ls); in llex()
363 int sep = skip_sep(ls); in llex()
365 read_long_string(ls, seminfo, sep); in llex()
369 else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING); in llex()
372 next(ls); in llex()
373 if (ls->current != '=') return '='; in llex()
374 else { next(ls); return TK_EQ; } in llex()
377 next(ls); in llex()
378 if (ls->current != '=') return '<'; in llex()
379 else { next(ls); return TK_LE; } in llex()
382 next(ls); in llex()
383 if (ls->current != '=') return '>'; in llex()
384 else { next(ls); return TK_GE; } in llex()
387 next(ls); in llex()
388 if (ls->current != '=') return '~'; in llex()
389 else { next(ls); return TK_NE; } in llex()
393 read_string(ls, ls->current, seminfo); in llex()
397 save_and_next(ls); in llex()
398 if (check_next(ls, ".")) { in llex()
399 if (check_next(ls, ".")) in llex()
403 else if (!isdigit(ls->current)) return '.'; in llex()
405 read_numeral(ls, seminfo); in llex()
413 if (isspace(ls->current)) { in llex()
414 lua_assert(!currIsNewline(ls)); in llex()
415 next(ls); in llex()
418 else if (isdigit(ls->current)) { in llex()
419 read_numeral(ls, seminfo); in llex()
422 else if (isalpha(ls->current) || ls->current == '_') { in llex()
426 save_and_next(ls); in llex()
427 } while (isalnum(ls->current) || ls->current == '_'); in llex()
428 ts = luaX_newstring(ls, luaZ_buffer(ls->buff), in llex()
429 luaZ_bufflen(ls->buff)); in llex()
438 int c = ls->current; in llex()
439 next(ls); in llex()
448 void luaX_next (LexState *ls) { in luaX_next() argument
449 ls->lastline = ls->linenumber; in luaX_next()
450 if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ in luaX_next()
451 ls->t = ls->lookahead; /* use this one */ in luaX_next()
452 ls->lookahead.token = TK_EOS; /* and discharge it */ in luaX_next()
455 ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ in luaX_next()
459 void luaX_lookahead (LexState *ls) { in luaX_lookahead() argument
460 lua_assert(ls->lookahead.token == TK_EOS); in luaX_lookahead()
461 ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); in luaX_lookahead()