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