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