176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** $Id: llex.c,v 2.63.1.2 2013/08/30 15:49:41 roberto Exp $ 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** Lexical Analyzer 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** See Copyright Notice in lua.h 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef SYSLINUX 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <locale.h> 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define getlocaledecpoint() '.' 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define llex_c 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define LUA_CORE 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lua.h" 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lctype.h" 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ldo.h" 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "llex.h" 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lobject.h" 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lparser.h" 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lstate.h" 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lstring.h" 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ltable.h" 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lzio.h" 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define next(ls) (ls->current = zgetc(ls->z)) 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ORDER RESERVED */ 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic const char *const luaX_tokens [] = { 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "and", "break", "do", "else", "elseif", 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "end", "false", "for", "function", "goto", "if", 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "in", "local", "nil", "not", "or", "repeat", 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "return", "then", "true", "until", "while", 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "..", "...", "==", ">=", "<=", "~=", "::", "<eof>", 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "<number>", "<name>", "<string>" 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define save_and_next(ls) (save(ls, ls->current), next(ls)) 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic l_noret lexerror (LexState *ls, const char *msg, int token); 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void save (LexState *ls, int c) { 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Mbuffer *b = ls->buff; 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) { 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman size_t newsize; 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (luaZ_sizebuffer(b) >= MAX_SIZET/2) 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lexerror(ls, "lexical element too long", 0); 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman newsize = luaZ_sizebuffer(b) * 2; 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaZ_resizebuffer(ls->L, b, newsize); 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman b->buffer[luaZ_bufflen(b)++] = cast(char, c); 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid luaX_init (lua_State *L) { 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i=0; i<NUM_RESERVED; i++) { 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TString *ts = luaS_new(L, luaX_tokens[i]); 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaS_fix(ts); /* reserved words are never collected */ 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ts->tsv.extra = cast_byte(i+1); /* reserved word */ 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char *luaX_token2str (LexState *ls, int token) { 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (token < FIRST_RESERVED) { /* single-byte symbols? */ 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_assert(token == cast(unsigned char, token)); 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (lisprint(token)) ? luaO_pushfstring(ls->L, LUA_QL("%c"), token) : 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaO_pushfstring(ls->L, "char(%d)", token); 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *s = luaX_tokens[token - FIRST_RESERVED]; 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (token < TK_EOS) /* fixed format (symbols and reserved words)? */ 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return luaO_pushfstring(ls->L, LUA_QS, s); 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else /* names, strings, and numerals */ 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return s; 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic const char *txtToken (LexState *ls, int token) { 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (token) { 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case TK_NAME: 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case TK_STRING: 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case TK_NUMBER: 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save(ls, '\0'); 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return luaO_pushfstring(ls->L, LUA_QS, luaZ_buffer(ls->buff)); 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return luaX_token2str(ls, token); 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic l_noret lexerror (LexState *ls, const char *msg, int token) { 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char buff[LUA_IDSIZE]; 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaO_chunkid(buff, getstr(ls->source), LUA_IDSIZE); 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg); 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (token) 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token)); 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaD_throw(ls->L, LUA_ERRSYNTAX); 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanl_noret luaX_syntaxerror (LexState *ls, const char *msg) { 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lexerror(ls, msg, ls->t.token); 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** creates a new string and anchors it in function's table so that 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** it will not be collected until the end of the function's compilation 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** (by that time it should be anchored in function's prototype) 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 12876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanTString *luaX_newstring (LexState *ls, const char *str, size_t l) { 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_State *L = ls->L; 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TValue *o; /* entry for `str' */ 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TString *ts = luaS_newlstr(L, str, l); /* create new string */ 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setsvalue2s(L, L->top++, ts); /* temporarily anchor it in stack */ 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman o = luaH_set(L, ls->fs->h, L->top - 1); 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ttisnil(o)) { /* not in use yet? (see 'addK') */ 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* boolean value does not need GC barrier; 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman table has no metatable, so it does not need to invalidate cache */ 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman setbvalue(o, 1); /* t[string] = true */ 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaC_checkGC(L); 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { /* string already present */ 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ts = rawtsvalue(keyfromval(o)); /* re-use value previously stored */ 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L->top--; /* remove string from stack */ 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ts; 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** increment line number and skips newline sequence (any of 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** \n, \r, \n\r, or \r\n) 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void inclinenumber (LexState *ls) { 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int old = ls->current; 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_assert(currIsNewline(ls)); 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); /* skip `\n' or `\r' */ 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (currIsNewline(ls) && ls->current != old) 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); /* skip `\n\r' or `\r\n' */ 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (++ls->linenumber >= MAX_INT) 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaX_syntaxerror(ls, "chunk has too many lines"); 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source, 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int firstchar) { 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->decpoint = '.'; 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->L = L; 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->current = firstchar; 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->lookahead.token = TK_EOS; /* no look-ahead token */ 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->z = z; 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->fs = NULL; 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->linenumber = 1; 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->lastline = 1; 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->source = source; 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->envn = luaS_new(L, LUA_ENV); /* create env name */ 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaS_fix(ls->envn); /* never collect this name */ 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** ======================================================= 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** LEXICAL ANALYZER 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** ======================================================= 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int check_next (LexState *ls, const char *set) { 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ls->current == '\0' || !strchr(set, ls->current)) 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** change all characters 'from' in buffer to 'to' 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void buffreplace (LexState *ls, char from, char to) { 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman size_t n = luaZ_bufflen(ls->buff); 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *p = luaZ_buffer(ls->buff); 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (n--) 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (p[n] == from) p[n] = to; 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if !defined(getlocaledecpoint) 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define getlocaledecpoint() (localeconv()->decimal_point[0]) 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define buff2d(b,e) luaO_str2d(luaZ_buffer(b), luaZ_bufflen(b) - 1, e) 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** in case of format error, try to change decimal point separator to 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** the one defined in the current locale and check again 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void trydecpoint (LexState *ls, SemInfo *seminfo) { 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char old = ls->decpoint; 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->decpoint = getlocaledecpoint(); 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman buffreplace(ls, old, ls->decpoint); /* try new decimal separator */ 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!buff2d(ls->buff, &seminfo->r)) { 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* format error with correct decimal point: no more options */ 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */ 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lexerror(ls, "malformed number", TK_NUMBER); 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* LUA_NUMBER */ 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** this function is quite liberal in what it accepts, as 'luaO_str2d' 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** will reject ill-formed numerals. 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void read_numeral (LexState *ls, SemInfo *seminfo) { 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *expo = "Ee"; 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int first = ls->current; 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_assert(lisdigit(ls->current)); 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (first == '0' && check_next(ls, "Xx")) /* hexadecimal? */ 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman expo = "Pp"; 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (;;) { 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (check_next(ls, expo)) /* exponent part? */ 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman check_next(ls, "+-"); /* optional exponent sign */ 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (lisxdigit(ls->current) || ls->current == '.') 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else break; 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save(ls, '\0'); 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */ 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!buff2d(ls->buff, &seminfo->r)) /* format error? */ 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman trydecpoint(ls, seminfo); /* try to update decimal point separator */ 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** skip a sequence '[=*[' or ']=*]' and return its number of '='s or 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** -1 if sequence is malformed 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int skip_sep (LexState *ls) { 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int count = 0; 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int s = ls->current; 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_assert(s == '[' || s == ']'); 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (ls->current == '=') { 26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman count++; 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (ls->current == s) ? count : (-count) - 1; 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void read_long_string (LexState *ls, SemInfo *seminfo, int sep) { 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); /* skip 2nd `[' */ 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (currIsNewline(ls)) /* string starts with a newline? */ 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inclinenumber(ls); /* skip it */ 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (;;) { 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ls->current) { 28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case EOZ: 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lexerror(ls, (seminfo) ? "unfinished long string" : 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "unfinished long comment", TK_EOS); 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; /* to avoid warnings */ 28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case ']': { 28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (skip_sep(ls) == sep) { 28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); /* skip 2nd `]' */ 28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto endloop; 28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '\n': case '\r': { 29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save(ls, '\n'); 29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inclinenumber(ls); 29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ 29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: { 29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (seminfo) save_and_next(ls); 29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else next(ls); 30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } endloop: 30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (seminfo) 30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep), 30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaZ_bufflen(ls->buff) - 2*(2 + sep)); 30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void escerror (LexState *ls, int *c, int n, const char *msg) { 31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i; 31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaZ_resetbuffer(ls->buff); /* prepare error message */ 31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save(ls, '\\'); 31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < n && c[i] != EOZ; i++) 31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save(ls, c[i]); 31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lexerror(ls, msg, TK_STRING); 31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int readhexaesc (LexState *ls) { 32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int c[3], i; /* keep input for error message */ 32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int r = 0; /* result accumulator */ 32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman c[0] = 'x'; /* for error message */ 32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 1; i < 3; i++) { /* read two hexadecimal digits */ 32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman c[i] = next(ls); 32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!lisxdigit(c[i])) 32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman escerror(ls, c, i + 1, "hexadecimal digit expected"); 32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman r = (r << 4) + luaO_hexavalue(c[i]); 32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return r; 33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int readdecesc (LexState *ls) { 33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int c[3], i; 33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int r = 0; /* result accumulator */ 33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < 3 && lisdigit(ls->current); i++) { /* read up to 3 digits */ 33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman c[i] = ls->current; 33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman r = 10*r + c[i] - '0'; 33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); 34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (r > UCHAR_MAX) 34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman escerror(ls, c, i, "decimal escape too large"); 34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return r; 34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void read_string (LexState *ls, int del, SemInfo *seminfo) { 34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); /* keep delimiter (for error messages) */ 34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (ls->current != del) { 35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ls->current) { 35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case EOZ: 35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lexerror(ls, "unfinished string", TK_EOS); 35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; /* to avoid warnings */ 35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '\n': 35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '\r': 35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lexerror(ls, "unfinished string", TK_STRING); 35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; /* to avoid warnings */ 35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '\\': { /* escape sequences */ 35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int c; /* final character to be saved */ 36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); /* do not save the `\' */ 36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ls->current) { 36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 'a': c = '\a'; goto read_save; 36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 'b': c = '\b'; goto read_save; 36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 'f': c = '\f'; goto read_save; 36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 'n': c = '\n'; goto read_save; 36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 'r': c = '\r'; goto read_save; 36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 't': c = '\t'; goto read_save; 36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 'v': c = '\v'; goto read_save; 36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 'x': c = readhexaesc(ls); goto read_save; 37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '\n': case '\r': 37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inclinenumber(ls); c = '\n'; goto only_save; 37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '\\': case '\"': case '\'': 37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman c = ls->current; goto read_save; 37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case EOZ: goto no_save; /* will raise an error next loop */ 37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case 'z': { /* zap following span of spaces */ 37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); /* skip the 'z' */ 37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (lisspace(ls->current)) { 37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (currIsNewline(ls)) inclinenumber(ls); 37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else next(ls); 38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto no_save; 38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: { 38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!lisdigit(ls->current)) 38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman escerror(ls, &ls->current, 1, "invalid escape sequence"); 38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* digital escape \ddd */ 38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman c = readdecesc(ls); 38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto only_save; 38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman read_save: next(ls); /* read next character */ 39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman only_save: save(ls, c); /* save 'c' */ 39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman no_save: break; 39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: 39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); 39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); /* skip delimiter */ 40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, 40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaZ_bufflen(ls->buff) - 2); 40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int llex (LexState *ls, SemInfo *seminfo) { 40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaZ_resetbuffer(ls->buff); 40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (;;) { 40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (ls->current) { 40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '\n': case '\r': { /* line breaks */ 41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman inclinenumber(ls); 41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case ' ': case '\f': case '\t': case '\v': { /* spaces */ 41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); 41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '-': { /* '-' or '--' (comment) */ 41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); 41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ls->current != '-') return '-'; 42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* else is a comment */ 42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); 42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ls->current == '[') { /* long comment? */ 42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int sep = skip_sep(ls); 42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaZ_resetbuffer(ls->buff); /* `skip_sep' may dirty the buffer */ 42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (sep >= 0) { 42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman read_long_string(ls, NULL, sep); /* skip long comment */ 42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaZ_resetbuffer(ls->buff); /* previous call may dirty the buff. */ 42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* else short comment */ 43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (!currIsNewline(ls) && ls->current != EOZ) 43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); /* skip until end of line (or end of file) */ 43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '[': { /* long string or simply '[' */ 43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int sep = skip_sep(ls); 43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (sep >= 0) { 43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman read_long_string(ls, seminfo, sep); 44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return TK_STRING; 44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (sep == -1) return '['; 44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else lexerror(ls, "invalid long string delimiter", TK_STRING); 44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '=': { 44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); 44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ls->current != '=') return '='; 44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { next(ls); return TK_EQ; } 44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '<': { 45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); 45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ls->current != '=') return '<'; 45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { next(ls); return TK_LE; } 45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '>': { 45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); 45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ls->current != '=') return '>'; 45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { next(ls); return TK_GE; } 45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '~': { 46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); 46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ls->current != '=') return '~'; 46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { next(ls); return TK_NE; } 46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case ':': { 46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); 46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ls->current != ':') return ':'; 46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { next(ls); return TK_DBCOLON; } 46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '"': case '\'': { /* short literal strings */ 47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman read_string(ls, ls->current, seminfo); 47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return TK_STRING; 47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '.': { /* '.', '..', '...', or number */ 47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); 47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (check_next(ls, ".")) { 47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (check_next(ls, ".")) 47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return TK_DOTS; /* '...' */ 47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else return TK_CONCAT; /* '..' */ 48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (!lisdigit(ls->current)) return '.'; 48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* else go through */ 48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '0': case '1': case '2': case '3': case '4': 48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case '5': case '6': case '7': case '8': case '9': { 48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman read_numeral(ls, seminfo); 48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return TK_NUMBER; 48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case EOZ: { 49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return TK_EOS; 49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: { 49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (lislalpha(ls->current)) { /* identifier or reserved word? */ 49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman TString *ts; 49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman do { 49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save_and_next(ls); 49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } while (lislalnum(ls->current)); 49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ts = luaX_newstring(ls, luaZ_buffer(ls->buff), 49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaZ_bufflen(ls->buff)); 50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman seminfo->ts = ts; 50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isreserved(ts)) /* reserved word? */ 50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ts->tsv.extra - 1 + FIRST_RESERVED; 50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return TK_NAME; 50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { /* single-char tokens (+ - / ...) */ 50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int c = ls->current; 50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman next(ls); 51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return c; 51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid luaX_next (LexState *ls) { 51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->lastline = ls->linenumber; 52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ 52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->t = ls->lookahead; /* use this one */ 52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->lookahead.token = TK_EOS; /* and discharge it */ 52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ 52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint luaX_lookahead (LexState *ls) { 53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_assert(ls->lookahead.token == TK_EOS); 53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); 53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ls->lookahead.token; 53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 535