什么是语法制导翻译的实现?
语法制导翻译方案是一个上下文无关文法,其中属性与文法符号相关联,语义动作包含在花括号 ({ }) 中。这些语义动作是解析器在适当时间用于翻译的子例程。语义动作在产生式右侧的位置表示解析器实现它的时间。
当它可以生成翻译方案时,它应该提供在动作定义属性值时该属性值可用。这需要
产生式右侧符号的继承属性应该在直接位于该符号之前的动作(左侧)中计算,因为它可以定义为评估其右侧符号继承属性的动作。
评估产生式左侧非终结符综合属性的动作应该位于产生式右侧的末尾,因为它可以定义任何右侧文法符号的属性。
考虑一个包含产生式及其语义动作的例子。产生式是
E → E1 + E2
其语义动作将是
{E.Val = E1.Val + E2.Val}
语法制导翻译提供了一种描述输入-输出映射的方法,这种描述与实现无关。要实现语法制导翻译,可以使用一个由 STATE **& VAL** 两个数组组成的栈。每个 **STATE** 条目显示一个指向解析表的指针,每个 **VAL** 表示与对应的 **STATE** 符号关联的值。
**STATE** 数组包含上下文无关文法中出现的所有变量或标识符,**VAL** 数组包含每个变量的值。
**示例** - 对于产生式
A → BC
要计算变量 A 的翻译,首先必须将 B 和 C 与它们对应的值 B.VAL 和 C.VAL 分别插入到栈中。
自底向上解析器将在 BC 归约为 A 时执行翻译。
**归约前** - 顶部指针将指向 C 变量,VAL[TOP] 包含 C.VAL。VAL[TOP-1] 包含 B.VAL。
**归约后** - 当 BC 归约为 A 时,B 和 C 及其对应的值 B.VAL 和 C.VAL 将被弹出,并将带有 A.VAL 的 A 压入栈中。因此,归约后,栈在其栈顶将包含变量 A,而 VAL[TOP] 现在将包含 A.VAL。
∴ 对于产生式 A → BC