编译原理:属性文法与语法制导翻译

需积分: 50 1 下载量 44 浏览量 更新于2024-08-14 收藏 1.11MB PPT 举报
"这篇资料主要介绍了编译原理中的三个标准函数——mknode、mkleaf,以及它们在构建抽象语法树中的应用,并提及了编译原理中的重要概念:属性文法和语法制导翻译。" 在编译原理中,mknode 和 mkleaf 是两个常用的标准函数,用于构造抽象语法树(Abstract Syntax Tree, AST)。抽象语法树是源代码的结构化表示,它以树形结构展示程序的语法结构。这两个函数具体如下: 1. `mknode ( op, left , right )`:这个函数用于创建一个内部节点,表示一个操作符(op),并且有两个子节点,即左侧子节点(left)和右侧子节点(right)。例如,在构建表达式的抽象语法树时,'-' 或 '+' 这样的运算符会被用来连接两个操作数。 2. `mkleaf ( id , entry )` 和 `mkleaf ( num , val )`:这两个函数用于创建叶子节点,表示标识符(id, entry)和数值(num, val)。在示例中,`mkleaf` 被用来创建表示变量 'a' 和 'c' 的节点,以及数值 '4' 的节点。 以创建表达式 "a-4+c" 的抽象语法树为例,我们首先创建标识符 'a' 和 '4' 的叶子节点,然后用 `mknode` 创建带有操作符 '-' 的内部节点,将 'a' 和 '4' 连接起来。接着,创建标识符 'c' 的叶子节点,再用 `mknode` 创建带有操作符 '+' 的内部节点,将前面得到的 '-a4' 结果与 'c' 连接。这样就构建出了完整的抽象语法树。 接下来,我们转向编译原理中的语义分析部分,尤其是属性文法和语法制导翻译。语义分析是编译器处理过程中的重要阶段,它的任务是在词法分析和语法分析之后,深入理解源代码的含义,并为生成目标代码做准备。 6.1 属性文法是编译原理中的一个重要概念,由 Knuth 在1968年提出。文法中的每个符号都可以拥有属性,这些属性代表了编译器关注的信息。属性分为两种类型: - 综合属性(Synthetic Attributes):信息自下而上传递,通常由其子节点的属性值计算得出。 - 继承属性(Inherited Attributes):信息自上而下传递,依赖于兄弟节点或父节点的属性值。 语义规则定义了如何计算这些属性,可以用于执行静态语义检查、符号表操作和代码生成等任务。例如,一个简单的属性文法可以用于求解表达式的值,如上面给出的示例,其中E和T的属性值(val)根据它们的子节点计算得出。 在属性文法中,必须遵循一定的规则,如终结符只有综合属性,非终结符可以有综合和继承属性,而且每个产生式的语义规则只能涉及该产生式内的符号属性。此外,属性具有“封装”性,即计算规则不能跨越产生式边界。 编译原理中的mknode和mkleaf函数是构建抽象语法树的基础工具,而属性文法则是实现语义分析的关键机制。通过这些工具和理论,编译器能够理解和翻译复杂的源代码,生成目标代码。