什么是语法制导翻译方案?
语法制导翻译方案主要分为以下两种:
综合翻译
在这种翻译中,产生式规则左边变量的值取决于右边变量的值。
例如:
E → E(1) + E(2) {E.VAL = E(1).VAL + E(2).VAL}
这里,产生式规则左边(LHS)的E可以通过右边(RHS)的E(1)和E(2)的值之和来计算,即LHS变量依赖于RHS变量。
在综合翻译中,节点上综合属性的值是从语法树中该节点子节点的属性值计算出来的。
例如,在以下产生式中:
E → E(1) + E(2)
E → digit
其中 digit = 0 | 1 | 2 |… . . | 9
字符串 "2 + 3" 的语法树为...
完整的语法树(包含翻译结果)将是一棵树,每个节点都标记有属性VAL。
这里,E.VAL表示非终结符E的值,它是根据语法树中该节点子节点的值计算出来的。
继承翻译
在这种翻译中,产生式规则右边非终结符的翻译取决于左边非终结符的翻译。
例如,考虑一个带有语义动作的产生式:
A → BC {B.VAL = 5 * A.VAL}
在这个产生式中,可以看到B的值取决于A的值。因此,产生式右边(RHS)非终结符的翻译(B.VAL)取决于产生式左边(LHS)非终结符的翻译(A.VAL)。
继承属性的值是从该节点的兄弟节点和父节点的属性值计算出来的。
例如,完整的语法树将是...
A → BC {B.VAL = 5 * A.VAL}
如果 A.VAL = 2,那么 B.VAL = 5 * 2 = 10
因此,B的值是由其父节点计算出来的。
继承翻译的例子——考虑产生式:
A → BC {C.VAL = 2 * B.VAL}
其完整的语法树将是...
这里,C节点的值依赖于其兄弟节点B。因此,在继承翻译中,节点上继承属性的值取决于其父节点或兄弟节点。
语法树上的翻译
考虑以下文法:
E → E + T
E → T
T → T * F
T → F
F → digit
以下是上述文法的语法制导定义。
产生式 | 语义动作 |
---|---|
E → E + T | E.VAL = E1.VAL + T1.VAL |
E → T | E.VAL = T.VAL |
T → T * F | T.VAL = T.VAL * F.VAL |
T → F | T.VAL = F.VAL |
F → digit | F.VAL = digit |
下图显示了字符串 "5 + 6 + 7" 的语法树和完整的语法树。
**完整的语法树(带注释的语法树)**——显示每个节点属性值的语法树。
LEXVAL表示叶节点上数字的值。