Free Electron
ext
lua
lua
src
lparser.h
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.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 <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 sidx;
/* index in the stack */
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 sidx;
/* index of the variable in the stack */
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
Generated by
1.8.13