- 1、本文档共36页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章语法制导的翻译
第五章 语法制导的翻译
本章继续展开2.3节的主题:使用上下文无关文法来引导对语言的翻译。本章讨论的翻译技术将在第六章中被用于类型检查和中间代码生成。这些技术也可以用于实现那些完成特殊任务的小型语言;本章包含了一个有关排版的例子。
如2.3.2节讨论的,我们把一些属性附加到代表语言构造的文法符号上,从而把信息和一个语言构造联系起来。一个语法制导定义通过附加在文法规则上的语义规则来定义属性的值。比如,一个从中缀表达式到后缀表达式的翻译器可能包含如下的产生式和规则:
产生式 语义规则
E(E1+T E.code = E1.code || T.code || ‘+’ (5.1)
这个产生式有两个非终结符号E和T;E1的下标区分了E在产生式体中的出现和E在产生式头上的出现。E和T都有一个字符串类型的属性code。上面的语义规则指明E的代码是通过将E1.code、T.code和字符‘+’连接而得到的。虽然这个规则明确指出对E的翻译结果是根据E1、T的翻译结果和’+’构造得到的,直接通过字符串操作来实现这个翻译过程可能很低效。
根据2.3.5节,一个语法制导的翻译方案在产生式体中包含了被称为语义动作的程序片段。比如
E(E+T{print ‘+’} (5.2)
按照惯例,语义动作被放在花括号之内。(对于作为文法符号出现的花括号,我们将用单引号把它们括起来,比如‘{’和‘}’。)一个语义动作在产生式体中的位置决定了这个动作的执行顺序。在产生式(5.2)中的语义动作出现在所有文法符号之后的末端;一般情况下,语义动作可以出现在一个产生式体中的任何位置。
对这两种标记方法作一个比较。语法制导定义更加易读,因此更适合作为对翻译的规约。而翻译方案更加高效,因此更加适合用于翻译的实现。
最通用的完成语法制导翻译的方法是先构造一个语法分析树,然后通过访问这棵树的结点来计算各个属性的值。在很多情况下,翻译可以在扫描分析过程中完成,不需要构造出明确的语法分析树。因此,我们将研究一类被称为“L-属性翻译”(L代表从左到右)的语法制导翻译方案。这一类方案实际上包含了所有可以在语法分析过程中完成的翻译方案。我也研究一个较小的类别,称为“S-属性翻译方案”(S代表综合)。这类方案可以很容易地和自底向上语法分析过程联系起来。
5.1 语法制导定义
一个语法制导定义(SDD,syntax-directed definition)是一个上下文无关文法和属性及语义规则的结合。属性和文法符号相联,而规则和产生式相联。如果X是一个符号而a是X的一个属性,那么我们用X.a来表示a在某个标号为X的分析树结点上的值。如果我们使用记录或对象来实现这个语法分析树的结点,那么X的属性可以被实现为代表X结点的记录或对象的数据域。属性可以是多种多样的,比如数字、类型、表格引用或串。这些串可能是很长的代码序列,比如编译器所使用的中间语言的代码。
5.1.1 继承属性和综合属性
我们将处理两种非终结符号的属性:
综合属性。在分析树结点N上的非终结符号A的综合属性是由N上的产生式所关联的语义规则来定义的。请注意,这个产生式的头一定是A。结点N上的一个综合属性只能通过N的子结点或N本身的属性值来定义。
继承属性。在分析树结点N上的一个非终结符号B的一个继承属性是由N的父结点上的产生式所关联的语义规则来定义的。请注意,这个产生式的体中必然包含符号B。结点N上的继承属性只能通过N的父结点、N本身、和N的兄弟结点上的属性值来定义。
我们不允许结点N上的继承属性通过N的子结点上的属性值来定义,但是我们允许结点N上的一个综合属性通过结点本身的继承属性来定义。
终结符号可以具有综合属性,但是不能有继承属性。终结符号的属性值是由词法分析器提供的词法值;在SDD中没有计算终结符号的属性值的语义规则。
例子5.1:图5.1中的SDD是基于我们熟悉的、带有运算符*和+的算术表达式文法。它对一个以n作为结尾标记的表达式求值。在这个SDD中,每个非终结符号具有唯一的被称为val的综合属性。我们同时还假设终结符号digit具有一个综合属性lexval,它是由词法分析器返回的整数值。□
产生式1,即L(E n,的规则将L.val设置为E.val。我们将看到,它就是整个表达式的值。
产生式2,即E(E1+T,也有一个规则。它计算出E1和T的值的和,作为规则头E的val属性的值。在任何标号为E的结点N上,E的val值是N的两个子结点(标号分别为E和T)上的val值的和。
产生式3,即E(T,有唯一的规则,它定义了E的val值和对应于T的子结点的val值相同。产生式4和第二个产生式类似;它的规则将子结点的值相乘,而不是相加。产生式5和6的规则和第三个产生式的规
文档评论(0)