mirror of
https://github.com/lua/lua
synced 2024-11-22 12:51:30 +03:00
063d4e4543
This is the first commit for the branch Lua 5.3. All source files were copied from the official distribution of 5.3.5 in the Lua site. The test files are the same of 5.3.4. The manual came from the previous RCS repository, revision 1.167.1.2.
134 lines
4.3 KiB
C
134 lines
4.3 KiB
C
/*
|
|
** $Id: lparser.h,v 1.76.1.1 2017/04/19 17:20:42 roberto Exp $
|
|
** Lua Parser
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
#ifndef lparser_h
|
|
#define lparser_h
|
|
|
|
#include "llimits.h"
|
|
#include "lobject.h"
|
|
#include "lzio.h"
|
|
|
|
|
|
/*
|
|
** Expression and variable descriptor.
|
|
** Code generation for variables and expressions can be delayed to allow
|
|
** optimizations; An 'expdesc' structure describes a potentially-delayed
|
|
** variable/expression. It has a description of its "main" value plus a
|
|
** list of conditional jumps that can also produce its value (generated
|
|
** by short-circuit operators 'and'/'or').
|
|
*/
|
|
|
|
/* kinds of variables/expressions */
|
|
typedef enum {
|
|
VVOID, /* when 'expdesc' describes the last expression a list,
|
|
this kind means an empty list (so, no expression) */
|
|
VNIL, /* constant nil */
|
|
VTRUE, /* constant true */
|
|
VFALSE, /* constant false */
|
|
VK, /* constant in 'k'; info = index of constant in 'k' */
|
|
VKFLT, /* floating constant; nval = numerical float value */
|
|
VKINT, /* integer constant; nval = numerical integer value */
|
|
VNONRELOC, /* expression has its value in a fixed register;
|
|
info = result register */
|
|
VLOCAL, /* local variable; info = local register */
|
|
VUPVAL, /* upvalue variable; info = index of upvalue in 'upvalues' */
|
|
VINDEXED, /* indexed variable;
|
|
ind.vt = whether 't' is register or upvalue;
|
|
ind.t = table register or upvalue;
|
|
ind.idx = key's R/K index */
|
|
VJMP, /* expression is a test/comparison;
|
|
info = pc of corresponding jump instruction */
|
|
VRELOCABLE, /* expression can put result in any register;
|
|
info = instruction pc */
|
|
VCALL, /* expression is a function call; info = instruction pc */
|
|
VVARARG /* vararg expression; info = instruction pc */
|
|
} expkind;
|
|
|
|
|
|
#define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXED)
|
|
#define vkisinreg(k) ((k) == VNONRELOC || (k) == VLOCAL)
|
|
|
|
typedef struct expdesc {
|
|
expkind k;
|
|
union {
|
|
lua_Integer ival; /* for VKINT */
|
|
lua_Number nval; /* for VKFLT */
|
|
int info; /* for generic use */
|
|
struct { /* for indexed variables (VINDEXED) */
|
|
short idx; /* index (R/K) */
|
|
lu_byte t; /* table (register or upvalue) */
|
|
lu_byte vt; /* whether 't' is register (VLOCAL) or upvalue (VUPVAL) */
|
|
} ind;
|
|
} u;
|
|
int t; /* patch list of 'exit when true' */
|
|
int f; /* patch list of 'exit when false' */
|
|
} expdesc;
|
|
|
|
|
|
/* description of active local variable */
|
|
typedef struct Vardesc {
|
|
short idx; /* variable index in stack */
|
|
} Vardesc;
|
|
|
|
|
|
/* description of pending goto statements and label statements */
|
|
typedef struct Labeldesc {
|
|
TString *name; /* label identifier */
|
|
int pc; /* position in code */
|
|
int line; /* line where it appeared */
|
|
lu_byte nactvar; /* local level where it appears in current block */
|
|
} Labeldesc;
|
|
|
|
|
|
/* list of labels or gotos */
|
|
typedef struct Labellist {
|
|
Labeldesc *arr; /* array */
|
|
int n; /* number of entries in use */
|
|
int size; /* array size */
|
|
} Labellist;
|
|
|
|
|
|
/* dynamic structures used by the parser */
|
|
typedef struct Dyndata {
|
|
struct { /* list of active local variables */
|
|
Vardesc *arr;
|
|
int n;
|
|
int size;
|
|
} actvar;
|
|
Labellist gt; /* list of pending gotos */
|
|
Labellist label; /* list of active labels */
|
|
} Dyndata;
|
|
|
|
|
|
/* control of blocks */
|
|
struct BlockCnt; /* defined in lparser.c */
|
|
|
|
|
|
/* state needed to generate code for a given function */
|
|
typedef struct FuncState {
|
|
Proto *f; /* current function header */
|
|
struct FuncState *prev; /* enclosing function */
|
|
struct LexState *ls; /* lexical state */
|
|
struct BlockCnt *bl; /* chain of current blocks */
|
|
int pc; /* next position to code (equivalent to 'ncode') */
|
|
int lasttarget; /* 'label' of last 'jump label' */
|
|
int jpc; /* list of pending jumps to 'pc' */
|
|
int nk; /* number of elements in 'k' */
|
|
int np; /* number of elements in 'p' */
|
|
int firstlocal; /* index of first local var (in Dyndata array) */
|
|
short nlocvars; /* number of elements in 'f->locvars' */
|
|
lu_byte nactvar; /* number of active local variables */
|
|
lu_byte nups; /* number of upvalues */
|
|
lu_byte freereg; /* first free register */
|
|
} FuncState;
|
|
|
|
|
|
LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
|
|
Dyndata *dyd, const char *name, int firstchar);
|
|
|
|
|
|
#endif
|