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 of 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.ridx = register index; 39 var.vidx = relative index in 'actvar.arr' */ 40 VUPVAL, /* upvalue variable; info = index of upvalue in 'upvalues' */ 41 VCONST, /* compile-time <const> variable; 42 info = absolute index in 'actvar.arr' */ 43 VINDEXED, /* indexed variable; 44 ind.t = table register; 45 ind.idx = key's R index */ 46 VINDEXUP, /* indexed upvalue; 47 ind.t = table upvalue; 48 ind.idx = key's K index */ 49 VINDEXI, /* indexed variable with constant integer; 50 ind.t = table register; 51 ind.idx = key's value */ 52 VINDEXSTR, /* indexed variable with literal string; 53 ind.t = table register; 54 ind.idx = key's K index */ 55 VJMP, /* expression is a test/comparison; 56 info = pc of corresponding jump instruction */ 57 VRELOC, /* expression can put result in any register; 58 info = instruction pc */ 59 VCALL, /* expression is a function call; info = instruction pc */ 60 VVARARG /* vararg expression; info = instruction pc */ 61 } expkind; 62 63 64 #define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXSTR) 65 #define vkisindexed(k) (VINDEXED <= (k) && (k) <= VINDEXSTR) 66 67 68 typedef struct expdesc { 69 expkind k; 70 union { 71 lua_Integer ival; /* for VKINT */ 72 lua_Number nval; /* for VKFLT */ 73 TString *strval; /* for VKSTR */ 74 int info; /* for generic use */ 75 struct { /* for indexed variables */ 76 short idx; /* index (R or "long" K) */ 77 lu_byte t; /* table (register or upvalue) */ 78 } ind; 79 struct { /* for local variables */ 80 lu_byte ridx; /* register holding the variable */ 81 unsigned short vidx; /* compiler index (in 'actvar.arr') */ 82 } var; 83 } u; 84 int t; /* patch list of 'exit when true' */ 85 int f; /* patch list of 'exit when false' */ 86 } expdesc; 87 88 89 /* kinds of variables */ 90 #define VDKREG 0 /* regular */ 91 #define RDKCONST 1 /* constant */ 92 #define RDKTOCLOSE 2 /* to-be-closed */ 93 #define RDKCTC 3 /* compile-time constant */ 94 95 /* description of an active local variable */ 96 typedef union Vardesc { 97 struct { 98 TValuefields; /* constant value (if it is a compile-time constant) */ 99 lu_byte kind; 100 lu_byte ridx; /* register holding the variable */ 101 short pidx; /* index of the variable in the Proto's 'locvars' array */ 102 TString *name; /* variable name */ 103 } vd; 104 TValue k; /* constant value (if any) */ 105 } Vardesc; 106 107 108 109 /* description of pending goto statements and label statements */ 110 typedef struct Labeldesc { 111 TString *name; /* label identifier */ 112 int pc; /* position in code */ 113 int line; /* line where it appeared */ 114 lu_byte nactvar; /* number of active variables in that position */ 115 lu_byte close; /* goto that escapes upvalues */ 116 } Labeldesc; 117 118 119 /* list of labels or gotos */ 120 typedef struct Labellist { 121 Labeldesc *arr; /* array */ 122 int n; /* number of entries in use */ 123 int size; /* array size */ 124 } Labellist; 125 126 127 /* dynamic structures used by the parser */ 128 typedef struct Dyndata { 129 struct { /* list of all active local variables */ 130 Vardesc *arr; 131 int n; 132 int size; 133 } actvar; 134 Labellist gt; /* list of pending gotos */ 135 Labellist label; /* list of active labels */ 136 } Dyndata; 137 138 139 /* control of blocks */ 140 struct BlockCnt; /* defined in lparser.c */ 141 142 143 /* state needed to generate code for a given function */ 144 typedef struct FuncState { 145 Proto *f; /* current function header */ 146 struct FuncState *prev; /* enclosing function */ 147 struct LexState *ls; /* lexical state */ 148 struct BlockCnt *bl; /* chain of current blocks */ 149 int pc; /* next position to code (equivalent to 'ncode') */ 150 int lasttarget; /* 'label' of last 'jump label' */ 151 int previousline; /* last line that was saved in 'lineinfo' */ 152 int nk; /* number of elements in 'k' */ 153 int np; /* number of elements in 'p' */ 154 int nabslineinfo; /* number of elements in 'abslineinfo' */ 155 int firstlocal; /* index of first local var (in Dyndata array) */ 156 int firstlabel; /* index of first label (in 'dyd->label->arr') */ 157 short ndebugvars; /* number of elements in 'f->locvars' */ 158 lu_byte nactvar; /* number of active local variables */ 159 lu_byte nups; /* number of upvalues */ 160 lu_byte freereg; /* first free register */ 161 lu_byte iwthabs; /* instructions issued since last absolute line info */ 162 lu_byte needclose; /* function needs to close upvalues when returning */ 163 } FuncState; 164 165 166 LUAI_FUNC int luaY_nvarstack (FuncState *fs); 167 LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, 168 Dyndata *dyd, const char *name, int firstchar); 169 170 171 #endif 172