18e3e3a7aSWarner Losh /* 2*0495ed39SKyle Evans ** $Id: llex.h $ 38e3e3a7aSWarner Losh ** Lexical Analyzer 48e3e3a7aSWarner Losh ** See Copyright Notice in lua.h 58e3e3a7aSWarner Losh */ 68e3e3a7aSWarner Losh 78e3e3a7aSWarner Losh #ifndef llex_h 88e3e3a7aSWarner Losh #define llex_h 98e3e3a7aSWarner Losh 10*0495ed39SKyle Evans #include <limits.h> 11*0495ed39SKyle Evans 128e3e3a7aSWarner Losh #include "lobject.h" 138e3e3a7aSWarner Losh #include "lzio.h" 148e3e3a7aSWarner Losh 158e3e3a7aSWarner Losh 16*0495ed39SKyle Evans /* 17*0495ed39SKyle Evans ** Single-char tokens (terminal symbols) are represented by their own 18*0495ed39SKyle Evans ** numeric code. Other tokens start at the following value. 19*0495ed39SKyle Evans */ 20*0495ed39SKyle Evans #define FIRST_RESERVED (UCHAR_MAX + 1) 218e3e3a7aSWarner Losh 228e3e3a7aSWarner Losh 238e3e3a7aSWarner Losh #if !defined(LUA_ENV) 248e3e3a7aSWarner Losh #define LUA_ENV "_ENV" 258e3e3a7aSWarner Losh #endif 268e3e3a7aSWarner Losh 278e3e3a7aSWarner Losh 288e3e3a7aSWarner Losh /* 298e3e3a7aSWarner Losh * WARNING: if you change the order of this enumeration, 308e3e3a7aSWarner Losh * grep "ORDER RESERVED" 318e3e3a7aSWarner Losh */ 328e3e3a7aSWarner Losh enum RESERVED { 338e3e3a7aSWarner Losh /* terminal symbols denoted by reserved words */ 348e3e3a7aSWarner Losh TK_AND = FIRST_RESERVED, TK_BREAK, 358e3e3a7aSWarner Losh TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, 368e3e3a7aSWarner Losh TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, 378e3e3a7aSWarner Losh TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, 388e3e3a7aSWarner Losh /* other terminal symbols */ 398e3e3a7aSWarner Losh TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, 408e3e3a7aSWarner Losh TK_SHL, TK_SHR, 418e3e3a7aSWarner Losh TK_DBCOLON, TK_EOS, 428e3e3a7aSWarner Losh TK_FLT, TK_INT, TK_NAME, TK_STRING 438e3e3a7aSWarner Losh }; 448e3e3a7aSWarner Losh 458e3e3a7aSWarner Losh /* number of reserved words */ 46*0495ed39SKyle Evans #define NUM_RESERVED (cast_int(TK_WHILE-FIRST_RESERVED + 1)) 478e3e3a7aSWarner Losh 488e3e3a7aSWarner Losh 498e3e3a7aSWarner Losh typedef union { 508e3e3a7aSWarner Losh lua_Number r; 518e3e3a7aSWarner Losh lua_Integer i; 528e3e3a7aSWarner Losh TString *ts; 538e3e3a7aSWarner Losh } SemInfo; /* semantics information */ 548e3e3a7aSWarner Losh 558e3e3a7aSWarner Losh 568e3e3a7aSWarner Losh typedef struct Token { 578e3e3a7aSWarner Losh int token; 588e3e3a7aSWarner Losh SemInfo seminfo; 598e3e3a7aSWarner Losh } Token; 608e3e3a7aSWarner Losh 618e3e3a7aSWarner Losh 628e3e3a7aSWarner Losh /* state of the lexer plus state of the parser when shared by all 638e3e3a7aSWarner Losh functions */ 648e3e3a7aSWarner Losh typedef struct LexState { 658e3e3a7aSWarner Losh int current; /* current character (charint) */ 668e3e3a7aSWarner Losh int linenumber; /* input line counter */ 678e3e3a7aSWarner Losh int lastline; /* line of last token 'consumed' */ 688e3e3a7aSWarner Losh Token t; /* current token */ 698e3e3a7aSWarner Losh Token lookahead; /* look ahead token */ 708e3e3a7aSWarner Losh struct FuncState *fs; /* current function (parser) */ 718e3e3a7aSWarner Losh struct lua_State *L; 728e3e3a7aSWarner Losh ZIO *z; /* input stream */ 738e3e3a7aSWarner Losh Mbuffer *buff; /* buffer for tokens */ 748e3e3a7aSWarner Losh Table *h; /* to avoid collection/reuse strings */ 758e3e3a7aSWarner Losh struct Dyndata *dyd; /* dynamic structures used by the parser */ 768e3e3a7aSWarner Losh TString *source; /* current source name */ 778e3e3a7aSWarner Losh TString *envn; /* environment variable name */ 788e3e3a7aSWarner Losh } LexState; 798e3e3a7aSWarner Losh 808e3e3a7aSWarner Losh 818e3e3a7aSWarner Losh LUAI_FUNC void luaX_init (lua_State *L); 828e3e3a7aSWarner Losh LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, 838e3e3a7aSWarner Losh TString *source, int firstchar); 848e3e3a7aSWarner Losh LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); 858e3e3a7aSWarner Losh LUAI_FUNC void luaX_next (LexState *ls); 868e3e3a7aSWarner Losh LUAI_FUNC int luaX_lookahead (LexState *ls); 878e3e3a7aSWarner Losh LUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s); 888e3e3a7aSWarner Losh LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); 898e3e3a7aSWarner Losh 908e3e3a7aSWarner Losh 918e3e3a7aSWarner Losh #endif 92