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