属性文法
- 在上下文无关文法的基础上,为每个文法符号配备若干相关的"值"
- 属性代表与文法符号相关信息
- 类型
- 代码序列
- 符号表内容
- 属性可以进行计算和传递
- 语义规则:对于文法的每个产生式都配备了一组属性的计算规则
- 属性代表与文法符号相关信息
- 属性:
- 综合属性:自上而下传递信息
- 继承属性:自下而上传递信息
-
对于产生式\(A\rightarrow \alpha\)的一个语义规则:\(\(b := f(c_1, c_2, \cdots,c_k)\)\)
- b是A(产生式左部)的一个综合属性;\(c_1, c_2, \cdots,c_k\)是产生式右部文法符号的属性
- 一个产生式左部的综合属性依赖与其所有的子节点
- \(b\)是产生式右部的某个文法符号的一个继承属性;\(c_1, c_2, \cdots,c_k\)是\(A\)或者产生式右部任何文法符号的属性
- 一个文法符号的继承属性依赖于其父节点和其兄弟结点的属性
[!attention] 一些关于属性文法的说明 1. 终结符只有综合属性,它由词法分析器提供 -
digit.lexval
表示单词符号的词法值 -id.entry
表示单词符号的符号表入口 2. 非终结符既可以有综合属性也可以有继承属性 3. 关于属性计算的规定: 1. 文法的开始符号的所有继承属性作为属性计算前的初始值 2. 必须为每个产生式的左部非终结符的综合属性提供一个计算规则 3. 与产生式\(A\rightarrow X_1X_2\cdots X_n\)相关联的属性计算规则只能是A的综合属性和\(X_i\)继承属性的计算,不能有\(A\)的继承属性和\(X_i\)的综合属性的计算规则 4. \(A\)的继承属性和\(X_i\)的综合属性有其他的产生式属性规则进行计算 5. 属性计算规则中只能使用产生式\(A\rightarrow X_1X_2\cdots X_n\)中所有文法符号的属性
- 一个文法符号的继承属性依赖于其父节点和其兄弟结点的属性
- b是A(产生式左部)的一个综合属性;\(c_1, c_2, \cdots,c_k\)是产生式右部文法符号的属性
-
语义规则所描述的工作:
- 属性计算
- 静态语义检查
- 符号表操作
- 中间代码生成
- 报错
[!attention] 语义规则可能产生副作用,也可能不是严格的函数 比如,某个规则给出可用的下一个数据单元的地址,这样的语义规则通常携程过程调用或过程段 此时,认为该语义规则定义了一个虚属性
综合属性
- 在语法树中,一个结点的综合属性的值由其子节点的属性值确定
- 使用自底向上的方法在每一个结点出使用语义规则计算综合属性的值
[!note] S-属性文法 仅仅使用综合属性的属性文法称为S-属性文法 ^4e6ede
继承属性
- 在语法树中,一个结点的继承属性由此结点的父节点和/或兄弟结点的某些属性确定
- 用继承属性来表示程序设计语言结构中的上下文依赖关系很方便