网站大量收购独家精品文档,联系QQ:2885784924

第5章语法制导翻译1重点.ppt

  1. 1、本文档共33页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
语义变量及辅助语义函数 1.NXQ?全局变量,用于指示所要产生的下一四元式的序号; 2.GEN(…)?其意义同前,每次调用,NXQ++; 3.int Merge(int p1,int p2)?将链首“指针”分别为p1和p2的两条链合并为一条,并返回新链的链首“指针”(此处的“指针”实际上是四元式的序号,应为整型值)我们假定四元式是以一结构形式表示(存储)的: struct _Quadruple{ int Op, arg1, arg2, Result; } QuadrupleList[]; 4.void BackPatch(int p,int t)?用四元式序号t回填以p为首的链,将链中每个四元式的Result域改写为t的值。 函数Merge( )及BackPatch( )的程序见书中P207 翻译布尔表达式的属性文法 1.Expr→iden {$$.TC=NXQ; $$.FC=NXQ+1; GEN(jnz,Entry($1),0,0); GEN(j,0,0,0);} | iden rop iden {$$.TC=NXQ; $$.FC=NXQ+1; GEN(jrop,Entry($1),Entry($3),0); GEN(j,0,0,0);} | ‘(’ Expr ‘)’ {$$.TC=$2.TC; $$.FC=$2.FC;} | ‘﹃’ Expr {$$.TC=$2.FC; $$.FC=$2.TC;} | Expr^ Expr {$$.TC=$2.TC;$$.FC=Merge($1.FC,$2.FC);} | Expr∨ Expr {$$.FC=$2.FC;$$.TC=Merge($1.TC,$2.TC);} Expr^→ Expr ‘∧’ {BackPatch($1.TC,NXQ);$$.FC=$1.FC;} Expr∨→ Expr ‘∨’ {BackPatch($1.FC,NXQ);$$.TC=$1.TC;} 布尔表达式的属性 Expr具有两个语义属性:TC和FC。这两个链的回填,还需根据表达式E所处的程序环境做进一步的处理。 (1)若E用于控制条件语句if-then-else,则遇到then时,应以当前NXQ值回填E的T链;对F链的回填,则在扫视到else时进行.对于while语句的情形,可类似地进行处理。 (2)若布尔式E仅用于计算值,可引入临时变量T用于标识E的计算结果.将文法(5.7)拓广,增加产生式 S→E{int N, T=NewTemp( ); BackPatch($1.TC,NXQ); BackPatch( $1.FC, NXQ+2;) GEN(=,’1’,0,T); GEN(j,0,0,N); GEN(=,‘0’,0,T); $$.PLACE=T; $$.Type =‘B’; } 第五章 语法制导翻译及中间代码生成 5.1 引言 在早期的一些编译程序中,是在语法分析的基础上根据源程序中各语法成份的语义,直接产生机器语言或汇编语言形式的目标代码。 现在的编译系统一般都将经过语法分析的源程序先翻译为某种形式的中间语言代码,然后再将其翻译为目标代码。 优点: 使编译程序各组成部分功能更单一; 使得编译程序的逻辑结构更为清晰,从而使编译程序更易于编写与调整;同时为代码优化和程序的可移植性提供了条件 本章要讨论的中间代码生成,是指把单词符号串形式的源程序转换为另一种等价的便于代码优化处理和目标代码生成表示。 目前常见的中间语言有逆波兰表示、三元式、四元式等等。 中间代码生成与语言的语义密切相关,目前采用语法制导翻译来描述语义。 方法:对文法中的每个产生式都附加一个语义动作或语义子程序, 语法分析程序除执行相应的语法分析动作外,还要执行相应的语义动作或调用相应的语义子程序。 5.1 引言(续) 这种模式既把语法分析与语义处理分开,又令其平行地进行,让其在同一遍扫描中同时完成语法分析和语义处理两项工作。 文法符号X的语义信息我们称之为语义属性或简称为属性(Attributes)。 我们用形如X.ATTR的记号来表示文法符号X的相关语义属性。 如果一个文法符号X在一产生式中多次出现,为了在语义上能够对其进行区分,可添加不同的上标。 文法符号及其语义属性 例如,文法G[E]: 产生式 语义子程序 E→E(1)+T {E.Val=E(1).val+T.val;} E→T {E.Val=T.Val;} T→digit {T.Val=digit;} 为了能在语法分析过程中平行地进行语义处理,可在语法分析栈旁边并行地设置一个语义信息栈 语法分析栈 语义分析栈

您可能关注的文档

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档