1 /* 2 ** $Id: lparser.h $ 3 ** Lua Parser 4 ** See Copyright Notice in lua.h 5 */ 6 7 #ifndef lparser_h 8 #define lparser_h 9 10 #include "llimits.h" 11 #include "lobject.h" 12 #include "lzio.h" 13 14 15 /* 16 ** Expression and variable descriptor. 17 ** Code generation for variables and expressions can be delayed to allow 18 ** optimizations; An 'expdesc' structure describes a potentially-delayed 19 ** variable/expression. It has a description of its "main" value plus a 20 ** list of conditional jumps that can also produce its value (generated 21 ** by short-circuit operators 'and'/'or'). 22 */ 23 24 /* kinds of variables/expressions */ 25 typedef enum { 26 VVOID, /* when 'expdesc' describes the last expression a list, 27 this kind means an empty list (so, no expression) */ 28 VNIL, /* constant nil */ 29 VTRUE, /* constant true */ 30 VFALSE, /* constant false */ 31 VK, /* constant in 'k'; info = index of constant in 'k' */ 32 VKFLT, /* floating constant; nval = numerical float value */ 33 VKINT, /* integer constant; ival = numerical integer value */ 34 VKSTR, /* string constant; strval = TString address; 35 (string is fixed by the lexer) */ 36 VNONRELOC, /* expression has its value in a fixed register; 37 info = result register */ 38 VLOCAL, /* local variable; var.sidx = stack index (local register); 39 var.vidx = relative index in 'actvar.arr' */ 40 VUPVAL, /* upvalue variable; info = index of upvalue in 'upvalues' */ 41 VCONST, /* compile-time constant; info = absolute index in 'actvar.arr' */ 42 VINDEXED, /* indexed variable; 43 ind.t = table register; 44 ind.idx = key's R index */ 45 VINDEXUP, /* indexed upvalue; 46 ind.t = table upvalue; 47 ind.idx = key's K index */ 48 VINDEXI, /* indexed variable with constant integer; 49 ind.t = table register; 50 ind.idx = key's value */ 51 VINDEXSTR, /* indexed variable with literal string; 52 ind.t = table register; 53 ind.idx = key's K index */ 54 VJMP, /* expression is a test/comparison; 55 info = pc of corresponding jump instruction */ 56 VRELOC, /* expression can put result in any register; 57 info = instruction pc */ 58 VCALL, /* expression is a function call; info = instruction pc */ 59 VVARARG /* vararg expression; info = instruction pc */ 60 } expkind; 61 62 63 #define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXSTR) 64 #define vkisindexed(k) (VINDEXED <= (k) && (k) <= VINDEXSTR) 65 66 67 typedef struct expdesc { 68 expkind k; 69 union { 70 lua_Integer ival; /* for VKINT */ 71 lua_Number nval; /* for VKFLT */ 72 TString *strval; /* for VKSTR */ 73 int info; /* for generic use */ 74 struct { /* for indexed variables */ 75 short idx; /* index (R or "long" K) */ 76 lu_byte t; /* table (register or upvalue) */ 77 } ind; 78 struct { /* for local variables */ 79 lu_byte sidx; /* index in the stack */ 80 unsigned short vidx; /* compiler index (in 'actvar.arr') */ 81 } var; 82 } u; 83 int t; /* patch list of 'exit when true' */ 84 int f; /* patch list of 'exit when false' */ 85 } expdesc; 86 87 88 /* kinds of variables */ 89 #define VDKREG 0 /* regular */ 90 #define RDKCONST 1 /* constant */ 91 #define RDKTOCLOSE 2 /* to-be-closed */ 92 #define RDKCTC 3 /* compile-time constant */ 93 94 /* description of an active local variable */ 95 typedef union Vardesc { 96 struct { 97 TValuefields; /* constant value (if it is a compile-time constant) */ 98 lu_byte kind; 99 lu_byte sidx; /* index of the variable in the stack */ 100 short pidx; /* index of the variable in the Proto's 'locvars' array */ 101 TString *name; /* variable name */ 102 } vd; 103 TValue k; /* constant value (if any) */ 104 } Vardesc; 105 106 107 108 /* description of pending goto statements and label statements */ 109 typedef struct Labeldesc { 110 TString *name; /* label identifier */ 111 int pc; /* position in code */ 112 int line; /* line where it appeared */ 113 lu_byte nactvar; /* number of active variables in that position */ 114 lu_byte close; /* goto that escapes upvalues */ 115 } Labeldesc; 116 117 118 /* list of labels or gotos */ 119 typedef struct Labellist { 120 Labeldesc *arr; /* array */ 121 int n; /* number of entries in use */ 122 int size; /* array size */ 123 } Labellist; 124 125 126 /* dynamic structures used by the parser */ 127 typedef struct Dyndata { 128 struct { /* list of all active local variables */ 129 Vardesc *arr; 130 int n; 131 int size; 132 } actvar; 133 Labellist gt; /* list of pending gotos */ 134 Labellist label; /* list of active labels */ 135 } Dyndata; 136 137 138 /* control of blocks */ 139 struct BlockCnt; /* defined in lparser.c */ 140 141 142 /* state needed to generate code for a given function */ 143 typedef struct FuncState { 144 Proto *f; /* current function header */ 145 struct FuncState *prev; /* enclosing function */ 146 struct LexState *ls; /* lexical state */ 147 struct BlockCnt *bl; /* chain of current blocks */ 148 int pc; /* next position to code (equivalent to 'ncode') */ 149 int lasttarget; /* 'label' of last 'jump label' */ 150 int previousline; /* last line that was saved in 'lineinfo' */ 151 int nk; /* number of elements in 'k' */ 152 int np; /* number of elements in 'p' */ 153 int nabslineinfo; /* number of elements in 'abslineinfo' */ 154 int firstlocal; /* index of first local var (in Dyndata array) */ 155 int firstlabel; /* index of first label (in 'dyd->label->arr') */ 156 short ndebugvars; /* number of elements in 'f->locvars' */ 157 lu_byte nactvar; /* number of active local variables */ 158 lu_byte nups; /* number of upvalues */ 159 lu_byte freereg; /* first free register */ 160 lu_byte iwthabs; /* instructions issued since last absolute line info */ 161 lu_byte needclose; /* function needs to close upvalues when returning */ 162 } FuncState; 163 164 165 LUAI_FUNC int luaY_nvarstack (FuncState *fs); 166 LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, 167 Dyndata *dyd, const char *name, int firstchar); 168 169 170 #endif 171