1dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* 2dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** $Id: lparser.h,v 1.70 2012/05/08 13:53:33 roberto Exp $ 3dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** Lua Parser 4dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** See Copyright Notice in lua.h 5dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com*/ 6dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 7dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#ifndef lparser_h 8dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define lparser_h 9dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 10dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "llimits.h" 11dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "lobject.h" 12dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "lzio.h" 13dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 14dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 15dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* 16dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** Expression descriptor 17dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com*/ 18dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 19dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef enum { 20dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VVOID, /* no value */ 21dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VNIL, 22dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VTRUE, 23dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VFALSE, 24dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VK, /* info = index of constant in `k' */ 25dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VKNUM, /* nval = numerical value */ 26dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VNONRELOC, /* info = result register */ 27dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VLOCAL, /* info = local register */ 28dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VUPVAL, /* info = index of upvalue in 'upvalues' */ 29dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VINDEXED, /* t = table register/upvalue; idx = index R/K */ 30dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VJMP, /* info = instruction pc */ 31dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VRELOCABLE, /* info = instruction pc */ 32dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VCALL, /* info = instruction pc */ 33dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com VVARARG /* info = instruction pc */ 34dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} expkind; 35dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 36dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 37dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXED) 38dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define vkisinreg(k) ((k) == VNONRELOC || (k) == VLOCAL) 39dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 40dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef struct expdesc { 41dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com expkind k; 42dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com union { 43dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com struct { /* for indexed variables (VINDEXED) */ 44dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com short idx; /* index (R/K) */ 45dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lu_byte t; /* table (register or upvalue) */ 46dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lu_byte vt; /* whether 't' is register (VLOCAL) or upvalue (VUPVAL) */ 47dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } ind; 48dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int info; /* for generic use */ 49dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lua_Number nval; /* for VKNUM */ 50dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } u; 51dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int t; /* patch list of `exit when true' */ 52dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int f; /* patch list of `exit when false' */ 53dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} expdesc; 54dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 55dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 56dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* description of active local variable */ 57dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef struct Vardesc { 58dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com short idx; /* variable index in stack */ 59dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} Vardesc; 60dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 61dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 62dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* description of pending goto statements and label statements */ 63dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef struct Labeldesc { 64dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com TString *name; /* label identifier */ 65dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int pc; /* position in code */ 66dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int line; /* line where it appeared */ 67dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lu_byte nactvar; /* local level where it appears in current block */ 68dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} Labeldesc; 69dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 70dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 71dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* list of labels or gotos */ 72dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef struct Labellist { 73dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Labeldesc *arr; /* array */ 74dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int n; /* number of entries in use */ 75dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int size; /* array size */ 76dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} Labellist; 77dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 78dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 79dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* dynamic structures used by the parser */ 80dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef struct Dyndata { 81dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com struct { /* list of active local variables */ 82dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Vardesc *arr; 83dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int n; 84dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int size; 85dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com } actvar; 86dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Labellist gt; /* list of pending gotos */ 87dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Labellist label; /* list of active labels */ 88dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} Dyndata; 89dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 90dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 91dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* control of blocks */ 92dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comstruct BlockCnt; /* defined in lparser.c */ 93dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 94dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 95dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* state needed to generate code for a given function */ 96dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef struct FuncState { 97dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Proto *f; /* current function header */ 98dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Table *h; /* table to find (and reuse) elements in `k' */ 99dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com struct FuncState *prev; /* enclosing function */ 100dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com struct LexState *ls; /* lexical state */ 101dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com struct BlockCnt *bl; /* chain of current blocks */ 102dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int pc; /* next position to code (equivalent to `ncode') */ 103dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int lasttarget; /* 'label' of last 'jump label' */ 104dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int jpc; /* list of pending jumps to `pc' */ 105dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int nk; /* number of elements in `k' */ 106dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int np; /* number of elements in `p' */ 107dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com int firstlocal; /* index of first local var (in Dyndata array) */ 108dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com short nlocvars; /* number of elements in 'f->locvars' */ 109dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lu_byte nactvar; /* number of active local variables */ 110dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lu_byte nups; /* number of upvalues */ 111dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com lu_byte freereg; /* first free register */ 112dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} FuncState; 113dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 114dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 115dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUAI_FUNC Closure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, 116dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com Dyndata *dyd, const char *name, int firstchar); 117dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 118dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com 119dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#endif 120