属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。这些属性代表与文法符号相关的信息,例如它的类型、值、代码序列 、符号表内容等等。属性和变量一样,可以进行计算和传递。
属性一般分为两类:
- 综合属性:用于“自下而上”传递信息。在语法树中,一个结点的综合属性的值由其子结点或其自身的某些属性值确定。
- 继承属性:用于“自上而下”传递信息。在语法树中,一个结点的继承属性值由该结点的父结点、兄弟结点和其自身的某些属性值确定。
注意:
- 终结符只有综合属性,由词法分析器提供
- 非终结符既可以有综合属性也可以有继承属性
- 文法开始符号的所有继承属性作为属性计算前的初始值
属性传递和计算的过程即是语义处理的过程,其相应的规则就称为语义规则。
语法制导定义(Syntax-Directed Definition, SDD):
- 每个文法符号和一个属性(attribute)集合相关联
- 每个产生式和一组语义规则(semantic rules)相关联,这些规则用于计算与该产生式中符号相关联的属性值
翻译方案(Translation Scheme):根据语义处理的先后顺序,把语义动作(程序片段)嵌入到产生式右部的合适位置。
- 属性的类型(综合/继承)表达了语义信息传递的方向
- 语义动作的位置表达了语义信息传递的时机(先后顺序)
树遍历的属性计算方法
以某种次序遍历语法树,直至计算出所有的属性。这种方法最简单,适应面最广。
缺点:
- 必须在语法树建立之后才能使用
- 效率不高
- 对每个非终结符号:多次重复计算所有能够计算的继承属性,最后计算所有能够计算的综合属性
一遍扫描的处理方法
在语法分析的同时计算属性值,处理完一个语法单位就执行与之相关的语义处理。
一遍扫描的语法制导翻译:为文法中每个产生式配上一组语义规则,在语法分析的同时执行这些语义规则。
计算语义规则,完成有关语义分析和代码生成动作的时机:
- 自上而下分析中一个产生式匹配输入串成功时
- 自下而上分析中一个产生式被用于进行归约时
S-属性文法
只含有综合属性的属性文法。
L-属性文法
L-属性文法支持从上到下、从下到上、从左到右的边。
例题
首先用S-属性文法处理的结果:
然后用L-属性文法处理的结果: