在递归的预测分析过程中进行翻译
递归的预测分析过程中,每一个非终结符都对应一个过程(可参考这篇文章)。在语义翻译中因为要计算非终结符的继承属性和综合属性,因此将非终结符对应的一个过程扩展为一个函数,此函数的参数就是各个非终结符的继承属性值,函数的返回值就是各个非终结符的综合属性值。
以下例子说明
非终结符T'对应的函数.png 非终结符T对应的函数.png 非终结符F对应的函数.png 分析器对应的主函数.png上述函数中黑色字体部分代表原有的分析器中非终结符对应的过程,蓝色字体部分字体部分就是扩展的部分。为T的综合属性定义一个局部变量Tval,并且将函数的返回值赋值给Tval,这样就完成了语义翻译器的编写。
算法
-
为每个非终结符A构造一个函数,A的每个继承属性对应该函数的一个 形参,函数的返回值是A的综合属性值。对出现在A产生式中的每个文法符号的每个属性都设置一个局部变量。
-
非终结符A的代码根据当前的输入决定使用哪个产生式。
-
与每个产生式有关的代码执行如下动作:从左到右考虑产生式右部的词法单元、非终结符及语义动作。
-
对于带有综合属性x 的词法单元 X ,把x 的值保存在局部变量
X.x 中;然后产生一个匹配 X 的调用,并继续输入 -
对于非终结符B ,产生一个右部带有函数调用的赋值语句c :=
B(b1, b2, …, bk) ,其中, b1, b2, …, bk 是代表B的继承属性的变量,c 是代表B的综合属性的变量。 -
对于每个动作,将其代码复制到语法分析器,并把对属性的引用改为对相应变量的引用。
网友评论