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

需积分: 22 30 下载量 189 浏览量 更新于2024-08-16 收藏 406KB PPT 举报
"该资源是关于编译原理的讲解,特别是属性文法和语法制导翻译的概念。通过一个具体的例子,3*5+4n的带注释的语法树,来展示如何理解和应用这些概念。" 在编译原理中,属性文法是一种扩展了上下文无关文法的理论,它允许我们在文法中附加语义信息,即所谓的属性。这些属性可以是表达式的结果值、变量的类型等,有助于进行语义分析和代码生成。属性文法由唐纳德·克努斯在1968年提出,它在每个文法符号上定义了一些属性,这些属性可以用来存储与该符号相关的各种信息。 1. **属性类型**: - 综合属性(Synthetic Attributes):通常自下而上传递,由产生式右部的子句计算得到,并赋值给产生式左部的父节点。在这个例子中,`digit.lexval`就是综合属性,因为它是根据输入的数字值计算出来的。 - 继承属性(Inherited Attributes):通常自上而下传递,从父节点传递给子节点。例如,在计算表达式时,运算符的优先级和结合性等信息可以作为继承属性传递。 2. **S_属性文法和L_属性文法**: - S_属性文法中,属性值是在产生式应用后立即计算的,适用于计算综合属性。 - L_属性文法中,属性值在产生式应用前计算,适用于计算继承属性。 3. **语法制导翻译(Attribute-Guided Translation)**: - 语法制导翻译是一种基于属性文法的翻译方法,其中每个产生式都有相应的语义规则,用于计算和传递属性值。例如,这里的`E.val`、`T.val`和`F.val`就是通过语义规则进行计算的。 - 在这个例子中,`E→E1+T`的语义规则可能是`E.val := E1.val + T.val`,表示E的值是E1和T的值相加。 4. **属性文法的计算**: - 终结符通常只有综合属性,如`digit.lexval`,它们的值由词法分析器提供。 - 非终结符可以有综合属性和继承属性。起始符号的继承属性作为计算的初始值。 - 属性计算规则只涉及产生式中的属性,且不能跨产生式计算。 - 属性计算器的参数或其他产生式的规则可以提供某些属性的初始值或计算结果。 5. **示例解释**: - `L→En`的语义规则是`print(E.val)`,意味着当解析到L时,会打印E的值。 - 对于`E→E1+T`,`E.val`被设置为`E1.val + T.val`的和,这是通过自下而上的方式计算的。 - 以此类推,最终得出整个表达式3*5+4n的值。 通过这个例子,我们可以看到属性文法如何用于编译器的语义分析阶段,它如何帮助我们从输入的源代码生成正确的中间表示,以及最终如何生成目标代码。理解属性文法及其应用对于编译器设计和实现至关重要。