语法制导翻译

2025 年 7 月 15 日 | 阅读时间:4 分钟

在语法制导翻译中,我们将一些非正式的符号与语法相关联,这些符号被称为语义规则。

所以我们可以说:

  • 在语法制导翻译中,每个非终结符可以获得一个或多个属性,或者有时根据属性的类型获得 0 个属性。 这些属性的值由与产生式规则相关联的语义规则评估。
  • 在语义规则中,属性是 VAL,属性可以保存任何东西,比如字符串、数字、内存位置和复杂记录。
  • 在语法制导翻译中,每当编程语言中遇到一个构造时,它都会根据该特定编程语言中定义的语义规则进行翻译。

示例

生产语义规则
E → E + TE.val := E.val + T.val
E → TE.val := T.val
T → T * FT.val := T.val + F.val
T → FT.val := F.val
F → (F)F.val := F.val
F → numF.val := num.lexval

E.val 是 E 的属性之一。

num.lexval 是词法分析器返回的属性。

语法制导翻译中的属性类型

语法制导翻译中的属性类型如下:

  • 综合属性:它是使用与分析树中节点 N 处的产生式规则相关联的语义规则定义的。 它主要用于自下而上的评估。 它仅取决于子节点的属性值。
    例如
    E - > E + T
    E.VAL = E.VAL + T.VAL
  • 继承属性:它是使用与分析树中节点 N 的原始产生式规则相关联的语义规则定义的。 它主要用于自上而下的评估。 它取决于父节点或兄弟节点的属性。
    例如
    E - > E + T
    Ep.VAL = Ep.VAL + T.VAL

在这里,E 和 Ep 是相同的,其中 E 表示子节点,p 表示父节点。

区分综合属性和继承属性。

以下是综合属性和继承属性之间各种差异的列表。

序号综合属性继承属性
1.在综合属性中,产生式规则的主要部分必须是非终结符。在继承属性中,产生式的主体必须包含作为符号的非终结符。
2它被具有 S 属性的 SDT 和具有 L 属性的 SDT 使用。它仅被 L 属性使用。
3.它是终结符和非终结符的集合。它是非终结符的集合。
4.它用于自下而上的评估以解析树。它用于自上而下的评估以解析树。
5.在此节点 n 中,仅在 n 的子节点上定义属性值在此节点 n 中,仅在其父节点及其兄弟节点上定义属性值。

属性文法

这是一种特殊类型的文法,用于编译器设计,以向语法规则添加更多信息。

它包括

  • 语义分析
  • 类型检查
  • 确保编程语言的正确性

以下是属性文法的示例

产生式规则语义规则描述
A → B CC.in := B.type此产生式规则用于传递类型信息。
B → intB.type := integer它用于定义数据类型,例如整数
B → realB.type := real它用于定义数据类型,例如实数
C → C1 , idC1.in := C.in

 

addtype (id.entry, C.in)

它用于将类型信息传递给子节点,并在符号表中更新相同的信息
C → idaddtype (id.entry, C.in)它用于将类型信息添加到符号表中

语法制导翻译的用途

以下是语法制导翻译的用途列表

  • 它用于执行算术表达式。
  • 它用于将中缀表达式转换为后缀表达式和中缀表达式转换为前缀表达式。
  • 它用于构建语法树。
  • 它用于构建中间代码。
  • 它用于在符号表中存储信息。

语法制导翻译的优点

以下是各种优点的列表

  • SDT 提供了一种结构化的方式,可以通过语法规则来描述翻译规则。
  • 实现起来简单易懂,可以翻译编程语言。
  • 它将翻译过程与解析过程分开,并且可以轻松地修改编译器。
  • 它通过优化翻译过程来实现高效的代码生成。

语法制导翻译的局限性

以下是各种局限性的列表

  • 这限制了可以使用 SDT 完成的翻译类型。
  • 在翻译规则复杂且无法通过语法规则轻松表达的情况下,它可能不够灵活。
  • 即使翻译过程受到限制,它也具有从错误中恢复的能力。

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

1. 为什么语法制导翻译在编译器设计中很重要?

答案:它通过将特性和函数与语法规则相关联,在编译器设计中发挥着重要作用。 它可以在编译期间转换和分析编程语言。

2. 列出语法制导翻译的不同属性类型?

答案:结构制导翻译有两种类型的属性

  • 综合属性
  • 继承属性。