一.属性文法
1.属性文法 :是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。
属性 :代表与文法符号相关的信息,和变量一样,可以进行计算和传递。
2.属性的分类
综合属性:用于“自下而上”传递信息;在语法树中,一个结点的综合属性的值,由其子结点的属性值确定
继承属性:用于“自上而下”传递信息;在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定
3.语义规则
属性计算的过程即是语义处理的过程
4.语义规则所描述的工作
包括:属性计算 静态语义检查 符号表操作 代码生成
二.基于属性文法的处理方法
1.基于属性文法的处理过程
输入串->语法树->依赖图->语义规则计算次序->计算结果
这种由源程序的语法结构所驱动的处理办法就是语法制导翻译法
2.依赖图
在一颗语法树中的结点的继承属性和综合属性之间的相互依赖关系可以用称作依赖图的一个有向图来描述。
3.树遍历的属性计算方法(常用的遍历方法是深度优先,从左到右的遍历方法)
4.一遍扫描的处理方法
与树遍历的属性计算方法不同,一遍扫描的处理方法是在语法分析的同时计算属性值,而不是语法分析构造语法树之后进行属性的计算,而且无需构造实际的语法树。
因为一遍扫描的处理方法与语法分析器的相互作用,它与下面两个因素密切相关:
所采用的语法分析方法 属性的计算次序
5.抽象语法树
从语法树中去掉对翻译不必要的信息,而获得更有效的源程序中间表示。
在抽象语法树中,操作符和关键字都不作为叶结点出现,而是把它们作为内部结点,即这些叶结点的父结点。
三.属性文法的自下而上计算
综合属性可以在分析符号串的同时由自上而下的分析器来构造
分析器可以保存与栈中文法符号有关的综合属性值
每当进行归约时,新的属性值就由栈中正在归约的产生式右边符号的属性值来计算
可以通过扩充分析器中的栈来存放这些综合属性值
S-属性文法的翻译器通常可借助于LR分析器实现
2. 翻译模式 :翻译模式是语法制导定义的一种便于翻译的书写形式。其中属性与文法符号相对应,语义规则或语义动作用花括号{ }括起来,可被插入到产生式右部的任何合适的位置上。
3.自顶向下的翻译
用翻译模式构造自顶向下翻译。