lua虚拟机的实现(虚拟机的整体结构)
文章目录
1.文本加载器
文本加载器包含加载脚本及脚本语义解析的功能,lua的文本加载器由lua lexstate进行处理。
lua语法支持语义关键字为:and, break, do, else, elseif, end, false, for, function,
goto, if, in, local, nil, not, or, repeat, return, then, true, until, while。
lua特殊语义子符为://, …, …, ==, >=, <=, ~=,<<, >>, ::, , , , , 。
语义信息的抽象结构为
typedef union {
lua_Number r; //浮点值
lua_Integer i; //整型值
TString *ts; //字符型(对象和字符串等)
}
语义与含义绑定结构(Token)
typedef struct Token {
int token;
SemInfo seminfo;
} Token
lua语义解析状态机- LexState
typedef struct LexState {
int current;
int linenumber;
int lastline;
Token t;
Token lookahead;
struct FuncState *fs;
struct lua_State *L;
ZIO *z;
Mbuffer *buff;
Table *h;
struct Dyndata *dyd;
TString *source;
TString *envn;
} LexState
2.文本解析器
虚拟机的脚本解析器有lparser进行处理,lparser负责加载和读取解析脚本, 对脚本中的语法错误进行处理。对于正确的脚本,lparser会生成相应的字节码用于脚本功能的执行。
lparser将脚本抽象为表达式,局部变量,跳转,动态结构和lua函数作为脚本功能的组合。
这几种组合包含了所有可能的脚本处理内容。下面是这几种结构和功能的解释。
表达式
表达式类型约定
typedef enum {
VVOID, //空
VNIL, //nil
VTRUE, //常量true
VFALSE, //常量false
VK, //
VKFLT, //浮点数
VKINT, //整型
VNONRELOC, //确定的值
VLOCAL, //局部变量
VUPVAL, //upvalue变量
VINDEXED, //可索引的变量
VJMP, //用于指令跳转
VRELOCABLE, //可保存至任意的register中的变量
VCALL, //用于函数调用
VVARARG