什么是编译器设计中的语法制导翻译方案?


这是一种表示法,其中上下文无关文法的每个产生式都与一组语义规则或动作相关联,并且每个语法符号都与一组属性相关联。因此,语法和语义动作组结合起来构成语法制导定义。

翻译可能是生成中间代码、目标代码或在符号表中添加关于构造类型的信息。现代编译器使用语法制导翻译,通过隐藏许多实现细节并使用户不必显式指定语义规则的求值顺序来简化用户的生活。

语义动作 - 当解析器识别出由上下文无关语法生成的输入字符串时,执行的动作。

例如,A → BC {语义动作}

语义动作用花括号括起来,并附加到产生式上。

在自顶向下解析器中,当 A 展开以推导出 BC,然后进一步推导出字符串 w 时,将执行语义动作。

在自底向上解析器中,当 BC 归约为 A 时,生成语义动作。

用于后缀代码的语法制导翻译方案

在后缀表示法中,运算符出现在操作数之后,即操作数之间的运算符被取出并附加到操作数之后。

例如,

考虑语法

E → E(1) + E(2)

E → E(1) ∗ E(2)

E → (E(1))

E → id

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

产生式
语义动作
   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 → id
E. CODE = id

后缀表示法的翻译

这里,E. CODE 表示语法符号 E 的属性或翻译。这意味着计算 E 的三地址语句序列。左侧非终结符的翻译是右侧非终结符的翻译的连接(| |),后跟运算符。

第一个产生式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 → id中,任何标识符的翻译都是标识符本身。

以下是语法符号 E 的各种属性或翻译。

  • E. VAL → 它表示 E 的值。
  • E. PLACE → 它描述了将保存表达式值的名称。
  • E. CODE → 计算表达式的三地址语句序列。
  • E. MODE → 它描述了 E 的数据类型。


更新于: 2021年11月8日

5K+ 浏览量

启动您的 职业生涯

通过完成课程获得认证

立即开始
广告