语义分析与属性文法:编译原理解析

需积分: 50 1 下载量 140 浏览量 更新于2024-08-14 收藏 1.11MB PPT 举报
该资源是关于编译原理的讲解,主要关注如何构建语法树和进行带注释的语法树分析,特别提到了属性文法和语法制导翻译的概念。 在编译原理中,语法树是一种重要的概念,它直观地表示了程序结构。给定的示例展示了一个简单的算术表达式的语法树,其中`L`是表达式的根节点,`E`、`n`、`+`、`T`、`F`、`4`以及数字3和5分别代表不同的运算符和操作数。这个树展示了表达式从左到右的计算顺序,并通过注释给出了每一步的计算结果,例如`T.val=3`表示`T`节点的值为3,最终整个表达式的值`E.val=19`。 接下来,资源提到了语义分析,这是编译过程中的关键步骤,它负责解析源代码的含义,并为生成目标代码做准备。属性文法是实现语义分析的一种方式,由Donald Knuth在1968年提出。在属性文法中,每个文法符号都可能有与之相关的属性,这些属性包含了符号的某些信息,通过定义语义规则来处理这些属性,从而实现对源代码的语义处理。 属性分为综合属性和继承属性。综合属性通常从下往上计算,依赖于子节点的属性值;而继承属性则从上往下计算,依赖于父节点或兄弟节点的属性。在语法树中,一个节点的综合属性值通常由其子节点的属性值计算得出,而继承属性值可能依赖于兄弟节点或父节点的属性值。 语义规则是一组规则,为每个文法产生式定义了属性的计算方法。规则形式可以是`b=f(c1,c2,...,ck)`,其中`b`是文法符号的属性,`f`是一个函数,`c1`到`ck`是其他属性。终结符通常只有综合属性,其值由词法分析器提供;而非终结符则可能同时拥有综合属性和继承属性。开始符号的所有继承属性是计算的初始值。 属性文法的规则必须遵守一定的封装性原则,即每个产生式的规则只能涉及该产生式左部的综合属性或右部的继承属性,且只能使用本产生式内文法符号的属性。语义规则可以用来执行各种任务,包括属性计算、静态语义检查、符号表操作以及代码生成。 以表达式求值为例,给出的属性文法如下: - `L->En{printf(E.val)}` - `E->E1+T{E.val=E1.val+T.val}` - `E->T{E.val=T.val}` - `T->T1*F{T.val=T1.val*F.val}` - `T->F{T.val=F.val}` 这个例子展示了如何通过属性文法进行表达式的求值,其中`E.val`和`T.val`是综合属性,它们的值根据子节点的属性值计算得出。最后,`printf(E.val)`在`L`节点处打印出整个表达式的结果。