lua2.1 语法解析过程(1)

来源:互联网 发布:淘宝介入买家怎么举证 编辑:程序博客网 时间:2024/05/18 02:48

lua2.1的语法解析过程跟我们在课本上学到的“语法分析->抽象语法->中间代码”的前端过程不一样,可能作者考虑到lua自身本不复杂,或者并不需要支持多种后端分析器,所以省略了“抽象语法”和“中间代码”这个过程,直接可执行的字节码。

 

lua2.1是在lua.stx中描述语法解析过程,这个文件最终会被yacc使用并生成真正的的语法分析文件。由于yacc使用了自底向上的的解析方式,我们在分析lua2.1的语法解析的时候也就相应地使用以小见大的方式:优先先分析语法树的距离根节点远的节点。在开始之前我们先看一个结构:

 

这个结构的主要用途是在词法分析向语法分析器传值的时候使用,比如一个数字“1”,词法分析器发现它是一个数字,就会有这么一个过程:yylval.vFloat = (float)1;然后语法分析器会通过$n.vFloat取到值。

另外这个结构也会在语法分析过程中使用,它主要用于语法树的子结点向父节点传值的时候使用(父节点向子结点传值这种情况在

lua2.1中暂时没见着)。

YYSTYPE本质上是一个联合:

在使用vInt时,这个值一般表示是/否,也就是布尔值;在使用vFloat时一般表示数字的值;

在使用pChar的时候自不用解释,它是字符串,lua2.1的词法和语法分析过程中都没有用上(多余的?);

而使用vWord的时候就有点复杂了,lua2.1在碰到字符串比如“abc”的时候,会把这个字符串放到全局符号表中,并得到一个“常量”索引I,然后yylval.vWord = I,另外如果碰到一个关键字的话,vWord=(关键字在表上的关键字表上的索引);

vLong在词法分析过程中并没有用到,在语法解析过程中一般用于保存偏移值(字节码串上的偏移),在解析具有跳转过程的语句的

时候会用到,比如while语句;

pByte再词法分析的时候也没有用到,在语法分析的过程中表示一段可执行字节码,这个字段使用往往以为着有函数的定义(每个lua2.1函数都对应一段独立的字节码);

pNode在碰到一个非关键字的时候使用,在碰到一个非关键字的时候,lua2.1首先在全局符号表中查找(如果查找不到则分配)一个TreeNode节点并将其指针赋给pNode。

 

原创粉丝点击