| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | #ifndef _LJ_LEX_H |
| 7 | #define _LJ_LEX_H |
| 8 | |
| 9 | #include <stdarg.h> |
| 10 | |
| 11 | #include "lj_obj.h" |
| 12 | #include "lj_err.h" |
| 13 | |
| 14 | |
| 15 | #define TKDEF(_, __) \ |
| 16 | _(and) _(break) _(do) _(else) _(elseif) _(end) _(false) \ |
| 17 | _(for) _(function) _(goto) _(if) _(in) _(local) _(nil) _(not) _(or) \ |
| 18 | _(repeat) _(return) _(then) _(true) _(until) _(while) \ |
| 19 | __(concat, ..) __(dots, ...) __(eq, ==) __(ge, >=) __(le, <=) __(ne, ~=) \ |
| 20 | __(label, ::) __(number, <number>) __(name, <name>) __(string, <string>) \ |
| 21 | __(eof, <eof>) |
| 22 | |
| 23 | enum { |
| 24 | TK_OFS = 256, |
| 25 | #define TKENUM1(name) TK_##name, |
| 26 | #define TKENUM2(name, sym) TK_##name, |
| 27 | TKDEF(TKENUM1, TKENUM2) |
| 28 | #undef TKENUM1 |
| 29 | #undef TKENUM2 |
| 30 | TK_RESERVED = TK_while - TK_OFS |
| 31 | }; |
| 32 | |
| 33 | typedef int LexToken; |
| 34 | |
| 35 | |
| 36 | typedef struct BCInsLine { |
| 37 | BCIns ins; |
| 38 | BCLine line; |
| 39 | } BCInsLine; |
| 40 | |
| 41 | |
| 42 | typedef struct VarInfo { |
| 43 | GCRef name; |
| 44 | BCPos startpc; |
| 45 | BCPos endpc; |
| 46 | uint8_t slot; |
| 47 | uint8_t info; |
| 48 | } VarInfo; |
| 49 | |
| 50 | |
| 51 | typedef struct LexState { |
| 52 | struct FuncState *fs; |
| 53 | struct lua_State *L; |
| 54 | TValue tokenval; |
| 55 | TValue lookaheadval; |
| 56 | int current; |
| 57 | LexToken token; |
| 58 | LexToken lookahead; |
| 59 | MSize n; |
| 60 | const char *p; |
| 61 | SBuf sb; |
| 62 | lua_Reader rfunc; |
| 63 | void *rdata; |
| 64 | BCLine linenumber; |
| 65 | BCLine lastline; |
| 66 | GCstr *chunkname; |
| 67 | const char *chunkarg; |
| 68 | const char *mode; |
| 69 | VarInfo *vstack; |
| 70 | MSize sizevstack; |
| 71 | MSize vtop; |
| 72 | BCInsLine *bcstack; |
| 73 | MSize sizebcstack; |
| 74 | uint32_t level; |
| 75 | int endmark; |
| 76 | } LexState; |
| 77 | |
| 78 | LJ_FUNC int lj_lex_setup(lua_State *L, LexState *ls); |
| 79 | LJ_FUNC void lj_lex_cleanup(lua_State *L, LexState *ls); |
| 80 | LJ_FUNC void lj_lex_next(LexState *ls); |
| 81 | LJ_FUNC LexToken lj_lex_lookahead(LexState *ls); |
| 82 | LJ_FUNC const char *lj_lex_token2str(LexState *ls, LexToken token); |
| 83 | LJ_FUNC_NORET void lj_lex_error(LexState *ls, LexToken token, ErrMsg em, ...); |
| 84 | LJ_FUNC void lj_lex_init(lua_State *L); |
| 85 | |
| 86 | #endif |