编译原理——语法制导翻译

一、概述

语法制导翻译主要是使用上下文无关文法来引导对语言的翻译。语义分析的结果通常就表现为中间代码,因此,语义分析和中间代码生成在一起称为语义翻译。语法分析的同时直接进行语义分析,成为语法制导翻译。

将语义规则和语法规则(产生式)联系起来涉及两个概念:

语法制导定义(Syntax-directed definitions,SDD)

语法制导翻译方案(Syntax-directed Translation Scheme,SDT)

二、SDD和SDT

SDD是对上下文无关文法的推广:

将每个文法符号和一个语义属性集合相关联

将每个产生式和一组语义规则相关联,这些规则用于计算该产生式中各文法符号的属性值

语法制导的翻译方案SDT

SDT是在产生式体中嵌入了称为语义动作的程序片段的CFG,对文法符号的属性值进行计算。

语义动作放在花括号之内,语义动作在产生式体中的位置决定了这个动作的执行顺序。

一般情况下,语义动作可以出现在产生式体中的任何位置。SDD是关于语言翻译的高层次规格说明,隐藏了许多实现细节;SDT可以看做是对SDD的一个补充,它显式地指明了语义规则的计算顺序,以便说明某些实现细节。

三、继承属性和综合属性

3.1综合属性

综合属性(synthesized attribute):在分析树节点N上的非终结符号A的综合属性是由N上的产生式所关联的语义规则来定义的。注意:这个产生式的头一定是A。节点N上的综合属性只能通过N的子节点或N本身的属性值来定义。【终结符可以有综合属性,为词法分析器提供的词法值】

3.2继承属性

继承属性(inherited attribute):在分析树节点N上的非终结符号B的继承属性是由N的父节点上的产生式所关联的语义规则来定义的。注意:这个产生式的体中必然包括符号B。节点N上的继承属性只能通过N的父节点、N本身和N的兄弟节点上的属性值来定义。【终结符没有继承属性;终结符本身的属性已经被归为了综合属性】

节点N上的继承属性不可以通过N的子节点上的属性值来定义,但节点N上的综合属性可以通过N本身的继承属性来定义。终结符号可以具有综合属性,但是不能具有继承属性。终结符号的属性值是由词法分析器提供的词法值。在SDD中没有计算终结符号的属性值的语义规则。

3.3例子

例一:

在语法分析树上求值有助于将SDD所描述的翻译方案可视化。一个显示了它的各个属性的值的语法分析树称为注释语法分析树。

对于综合属性而言,因为依赖于子节点,所以很自然地,可以按照自下向上的文法分析方法获得val属性。在上面的注释语法分析树中我们可以看到,每个节点都关联了一个值。分析各个节点的属性的计算可以自下而上地完成。

例二:

接下来再看一下带有继承属性的SDD的例子

上面的文法是变量声明;这个例子中,产生式2和3的语义规则中, T 的属性是子节点定义的,综合属性;1和4可以看到,分别获得了兄弟节点和父节点的属性,所以是继承属性。这里的L.inh表示的就是它生成的变量的类型。最后的addtype是一个副作用,目的是在符号表中给相应的变量对应的位置,添加上它的属性值。

S-SDD转换为SDT

方法:

将每个语义动作都放在产生式的最后

如果一个S-SDD的基本文法可以使用LR分析技术,那么它的SDT可以在LR语法分析过程中实现

L-SDD转换为SDT

将L-SDD转换为SDT的规则:

将计算某个非终结符号A的继承属性的动作插入到产生式右部中紧靠在A的本次出现之前的位置上

将计算一个产生式左部符号的综合属性的动作放置在这个产生式右部的最右端

L-属性定义的SDT 实现:

如果一个L-SDD的基本文法可以使用LL分析技术,那么它的SDT可以在LL或LR语法分析过程中实现

在非递归的预测分析过程中进行语义翻译

在递归的预测分析过程中进行语义翻译

在LR分析过程中进行语义翻译

此时需要对语法分析栈进行扩充:

猜你喜欢

转载自blog.csdn.net/lqm1094583745/article/details/129712208
今日推荐