语法制导翻译方案

2025年7月7日 | 阅读 3 分钟

引言

  • 语法制导翻译方案是 上下文无关文法
  • 语法制导翻译方案用于评估语义规则的顺序。
  • 在翻译方案中,语义规则嵌入在产生式的右侧。
  • 要执行操作的位置用大括号括起来表示。它写在产生式的右侧。

示例

生产语义规则
S → E ${ printE.VAL }
E → E + E{E.VAL := E.VAL + E.VAL }
E → E * E{E.VAL := E.VAL * E.VAL }
E → (E){E.VAL := E.VAL }
E → I{E.VAL := I.VAL }
I → I digit{I.VAL := 10 * I.VAL + LEXVAL }
I → digit{ I.VAL:= LEXVAL}

各种语法制导翻译方案包括

后缀翻译方案

在这种方案中,语义操作在语法制导翻译的末尾执行。

例如

在上面的例子中,运算符出现在操作数之后。这意味着我们提取操作数之间的运算符,并将它们放在操作数之后。

让我们以以下例子为例。

产生式规则集合是

下面表格显示了语法的后缀翻译。

产生式规则语义动作
E → E(1) + E(2)E. CODE = E(1). CODE | | E(2). CODE | |'+'
E → E(1) ∗ E(2)E. CODE = E(1). CODE | | E(2). CODE | |'∗'
E → (E(1))E. CODE = E(1). CODE
E → idE. CODE = id

后缀表示法的翻译

在上面的例子中,'E.CODE' 指定了语法符号 E 的翻译。它表示一个计算为 E 的三地址语句序列。右侧的非终结符的翻译由连词 (| |) 完成,每个产生式左侧的非终结符的翻译由运算符完成。

后缀表示法翻译的逐步解释。

步骤 1:在产生式规则的第一步中。翻译 E. CODE 的值是两个翻译的组合,例如 E(1). CODE、E(2). CODE 和 '+' 符号。

步骤 2:在产生式规则的第二步中,翻译 E. CODE 的值是两个翻译的组合,例如 E(1). CODE、E(2). CODE 和 '∗' 符号。

步骤 3:在产生式规则的第三步中,带括号表达式的翻译与不带括号的表达式相同。

步骤 4:在产生式规则的第四步中,任何标识符的翻译就是标识符本身。

关于编译器设计中语法制导翻译的常见问题

1. 前缀表示法是什么意思?

答案:在这种类型的表示法中,运算符出现在操作数之前。

例如

+AB

2. 语法制导翻译方案是什么意思?

答案:语法制导翻译方案用于语法中,通过将程序部分与产生式规则关联来设计翻译。


下一主题SDT 实现