属性文法与语法制导翻译:抽象语法树构建

需积分: 22 30 下载量 53 浏览量 更新于2024-08-16 收藏 406KB PPT 举报
"本资源主要介绍了编译原理中的属性文法和语法制导翻译概念,特别是如何建立表达式的抽象语法树。文中提到了用于构建抽象语法树的三个基本函数:mknode用于创建运算符号节点,mkleaf分别用于创建标识符和数值节点。此外,还讨论了属性文法的基本要素,包括综合属性和继承属性,以及它们在文法符号中的作用和计算规则。" 详细知识点: 1. **抽象语法树(Abstract Syntax Tree, AST)**: 抽象语法树是一种树形结构,其中的每个内部节点代表一种运算,每个叶节点代表一个运算的原子部分,如标识符或常量。在本资源中,使用`mknode`创建运算符节点,用`mkleaf`创建标识符和数值节点,这些函数帮助我们构建AST来表示源代码的结构。 2. **属性文法(Attribute Grammar)**: 属性文法是扩展上下文无关文法的一种方法,通过为文法符号附加属性来表示额外的信息,如类型信息、值或代码片段。属性可以分为两种类型: - **综合属性(Synthetic Attributes)**: 从产生式右边的子节点信息自下而上计算,通常用于计算表达式的值。 - **继承属性(Inherited Attributes)**: 自上而下传递,用于从父节点传递信息到子节点,例如在类型检查或作用域解析中。 3. **语法制导翻译(Semantic Translation)**: 在每个文法产生式中,利用语义规则计算属性的值,这些规则描述了如何根据文法符号的属性生成代码或其他语义信息。规则的形式如 `b:=f(c1,c2,…,ck)`,其中 `f` 是函数,`b` 是目标属性,`c1, c2, ..., ck` 是输入属性。 4. **属性计算规则**: 终结符只有综合属性,而非终结符可以有综合属性和继承属性。每个产生式的属性计算规则只能使用该产生式中文法符号的属性。继承属性和综合属性的计算通常不直接在当前产生式的规则中完成,而是依赖于其他规则或外部输入。 5. **语义规则的应用**: 语义规则不仅用于计算属性值,还可以进行静态语义检查、符号表操作和代码生成。例如,规则 `C.d:=B.c+1` 和 `A.b:=A.a+B.c` 描述了如何基于其他属性计算新的属性值。 6. **示例分析**: 非终结符A、B和C的例子展示了属性的使用。A有继承属性 `a` 和综合属性 `b`,B有综合属性 `c`,C有继承属性 `d`。产生式 `A→BC` 的语义规则展示了属性如何在文法符号之间传递和计算。 7. **表达式处理**: 提到的产生式如 `L→En`、`E→E1+T` 等,以及对应的语义规则 `print(E.val)`,表明在处理表达式时,如何通过属性文法来确定表达式的值并进行打印操作。 属性文法和语法制导翻译是编译器设计中的重要组成部分,它们为实现语义分析提供了结构化的框架,允许编译器正确地理解和生成目标代码。通过这种方式,编译器可以确保源代码的语义正确性,并生成高效的目标代码。