1*8e3e3a7aSWarner Losh /* 2*8e3e3a7aSWarner Losh ** $Id: llex.h,v 1.79 2016/05/02 14:02:12 roberto Exp $ 3*8e3e3a7aSWarner Losh ** Lexical Analyzer 4*8e3e3a7aSWarner Losh ** See Copyright Notice in lua.h 5*8e3e3a7aSWarner Losh */ 6*8e3e3a7aSWarner Losh 7*8e3e3a7aSWarner Losh #ifndef llex_h 8*8e3e3a7aSWarner Losh #define llex_h 9*8e3e3a7aSWarner Losh 10*8e3e3a7aSWarner Losh #include "lobject.h" 11*8e3e3a7aSWarner Losh #include "lzio.h" 12*8e3e3a7aSWarner Losh 13*8e3e3a7aSWarner Losh 14*8e3e3a7aSWarner Losh #define FIRST_RESERVED 257 15*8e3e3a7aSWarner Losh 16*8e3e3a7aSWarner Losh 17*8e3e3a7aSWarner Losh #if !defined(LUA_ENV) 18*8e3e3a7aSWarner Losh #define LUA_ENV "_ENV" 19*8e3e3a7aSWarner Losh #endif 20*8e3e3a7aSWarner Losh 21*8e3e3a7aSWarner Losh 22*8e3e3a7aSWarner Losh /* 23*8e3e3a7aSWarner Losh * WARNING: if you change the order of this enumeration, 24*8e3e3a7aSWarner Losh * grep "ORDER RESERVED" 25*8e3e3a7aSWarner Losh */ 26*8e3e3a7aSWarner Losh enum RESERVED { 27*8e3e3a7aSWarner Losh /* terminal symbols denoted by reserved words */ 28*8e3e3a7aSWarner Losh TK_AND = FIRST_RESERVED, TK_BREAK, 29*8e3e3a7aSWarner Losh TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, 30*8e3e3a7aSWarner Losh TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, 31*8e3e3a7aSWarner Losh TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, 32*8e3e3a7aSWarner Losh /* other terminal symbols */ 33*8e3e3a7aSWarner Losh TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, 34*8e3e3a7aSWarner Losh TK_SHL, TK_SHR, 35*8e3e3a7aSWarner Losh TK_DBCOLON, TK_EOS, 36*8e3e3a7aSWarner Losh TK_FLT, TK_INT, TK_NAME, TK_STRING 37*8e3e3a7aSWarner Losh }; 38*8e3e3a7aSWarner Losh 39*8e3e3a7aSWarner Losh /* number of reserved words */ 40*8e3e3a7aSWarner Losh #define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1)) 41*8e3e3a7aSWarner Losh 42*8e3e3a7aSWarner Losh 43*8e3e3a7aSWarner Losh typedef union { 44*8e3e3a7aSWarner Losh lua_Number r; 45*8e3e3a7aSWarner Losh lua_Integer i; 46*8e3e3a7aSWarner Losh TString *ts; 47*8e3e3a7aSWarner Losh } SemInfo; /* semantics information */ 48*8e3e3a7aSWarner Losh 49*8e3e3a7aSWarner Losh 50*8e3e3a7aSWarner Losh typedef struct Token { 51*8e3e3a7aSWarner Losh int token; 52*8e3e3a7aSWarner Losh SemInfo seminfo; 53*8e3e3a7aSWarner Losh } Token; 54*8e3e3a7aSWarner Losh 55*8e3e3a7aSWarner Losh 56*8e3e3a7aSWarner Losh /* state of the lexer plus state of the parser when shared by all 57*8e3e3a7aSWarner Losh functions */ 58*8e3e3a7aSWarner Losh typedef struct LexState { 59*8e3e3a7aSWarner Losh int current; /* current character (charint) */ 60*8e3e3a7aSWarner Losh int linenumber; /* input line counter */ 61*8e3e3a7aSWarner Losh int lastline; /* line of last token 'consumed' */ 62*8e3e3a7aSWarner Losh Token t; /* current token */ 63*8e3e3a7aSWarner Losh Token lookahead; /* look ahead token */ 64*8e3e3a7aSWarner Losh struct FuncState *fs; /* current function (parser) */ 65*8e3e3a7aSWarner Losh struct lua_State *L; 66*8e3e3a7aSWarner Losh ZIO *z; /* input stream */ 67*8e3e3a7aSWarner Losh Mbuffer *buff; /* buffer for tokens */ 68*8e3e3a7aSWarner Losh Table *h; /* to avoid collection/reuse strings */ 69*8e3e3a7aSWarner Losh struct Dyndata *dyd; /* dynamic structures used by the parser */ 70*8e3e3a7aSWarner Losh TString *source; /* current source name */ 71*8e3e3a7aSWarner Losh TString *envn; /* environment variable name */ 72*8e3e3a7aSWarner Losh } LexState; 73*8e3e3a7aSWarner Losh 74*8e3e3a7aSWarner Losh 75*8e3e3a7aSWarner Losh LUAI_FUNC void luaX_init (lua_State *L); 76*8e3e3a7aSWarner Losh LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, 77*8e3e3a7aSWarner Losh TString *source, int firstchar); 78*8e3e3a7aSWarner Losh LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); 79*8e3e3a7aSWarner Losh LUAI_FUNC void luaX_next (LexState *ls); 80*8e3e3a7aSWarner Losh LUAI_FUNC int luaX_lookahead (LexState *ls); 81*8e3e3a7aSWarner Losh LUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s); 82*8e3e3a7aSWarner Losh LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); 83*8e3e3a7aSWarner Losh 84*8e3e3a7aSWarner Losh 85*8e3e3a7aSWarner Losh #endif 86