编译器笔记26-语法制导翻译-L属性定义的自底向上翻译

L-属性定义的自底向上翻译

给定一个以LL文法为基础的L-SDD,可以修改这个文法,并在LR语法分析过程中计算这个新文法之上的SDD。

修改后的SDT.png

注:事实上我们可以证明如果一个文法是LL的,那么标记非终结符可以嵌入到产生式的任何位置。而且得到的文法是LR文法。(LL与LR的区别在哪?)现在语义动作都为与产生式的末尾位置,开起来该修改后的SDT可以在自底向上的语法分析过程中实现了。但是看起来这个转换过程是非法的,因为在这两空产生式关联的语义动作中,将要使用M或N产生式没有出现的非终结符F和T的属性。但是我们是基于LR分析栈来实现语义动作,因此这些需要的属性已经出现在栈中的某个已知的位置。

0.png
1.png
2.png
3.png
4.png
将语义动作改写为可执行的栈操作.png

LR分析是移入归约,输入符不可能包含语义动作a,如果不这么改就找不到合适的产生式归约了。

问: 为什么栈不设计成想自顶向下分析扩展多一个字段存放继承属性?
答: 标记非终结符M有存储数据的功能,跟非递归预测分析过程中的a还是有区别的,a的作用只是用于操作已有非终结符的属性并保存在非终结符的属性当中。而在L属性定义的自底向上翻译的过程中,M起到了a执行动作的功能之余还能替代非递归预测分析过程中非终结符对应的继承属性字段的存储功能。

你可能感兴趣的:(编译器笔记26-语法制导翻译-L属性定义的自底向上翻译)