第5章 语法制导翻译-4.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算Expr(1)的四元式序列,结果=临时变量T1 (=, T1, 0, i ) (i=Entry(identifier) ) 计算Expr(2)的四元式序列,结果=临时变量T1 (p) ( j≤, identifier, T2, p+2) (p+1) ( j, 0, 0, 0 ) ←Statement.Chain (p+2) Statement(1)的代码 (q) (+, identifier, ‘1’, identifier) (q+1) ( j, 0, 0, p) (q+2) ←NXQ 除了while 循环和for循环外,常见的还有一种repeat循环,其处理方法与前两种循环类似,我们将它留作习题给大家。 * * 5.6.3? 语句标号及GOTO语句的翻译 语句标号用于标识一个语句。在常见语言中,标号的定义在形式上是通过产生式 Statement→label : Statement (5.13) 所描述的方式来定义的。因此,我们通常把源程序中形如“ label : Statement”的标号出现,称为定义性出现。 在许多语言中,通过执行形如 GOTO label 的转向语句,把控制无条件地转移到由标号label 所标识的语句。这种出现在GOTO语句或其它类似语句中的标号,我们称为使用性标号。在许多语言中,允许标号的使用性出现位于定义性出现之前。 * * 标号具有的语义属性 标号除其名字外,还有一个重要的属性,就是它所标识语句的四元式序列的首地址(序号)。 另外,因标号的使用出现允许先于定义出现,所以还需有一个属性用于标志该标号是否已被定义,其初值为0(假,即尚未定义)。 由于标号的信息在程序中使用频繁,我们可将其填写在符号表中备查,因而只需把该标号在表中的序号作为其语义属性即可。 对于一个标号而言,它在符号表中的登记项通常有如下的内容: NAME | [CAT] | DEF | … | ADDR 名字 [label] 0|1 四元式序号/链 * * goto语句的翻译 对于转向语句 GOTO L,翻译程序将产生一个形如(j, 0, 0, p)的四元式。 若此时L的表项的DEF域为1(即已定义),则将相应的ADDR域作为此四元式的转向目标(p=ADDR); 若DEF=0,可利用转移四元式的Result域将所有转向同一目标的四元式拉成一个链,待L有定义时回填,链首由L在表中的ADDR域指示 源程序 四元式 goto L; (p) (j,0,0,0) … … goto L; (q) (j,0,0,p) … … goto L; (r) (j,0,0,q) NAME CAT DEF … ADDR … … … … … lab 0 … r * * goto语句的翻译(续) 下面,我们讨论转向语句与标号定义语句的翻译。转向语句的文法为 Statement→goto label (5.14) 对于标号定义语句,为了能够记录下标号的定义点(即它所标识语句的第一四元式之序号),我们将产生式(5.13)拆分为二: Statement→LabelDef Statement (5.15) LabelDef → label ‘:’ (5.16) 现在,我们可以为上述文法添加语义动作,构造属性翻译文法。 * * goto语句的翻译(续) Statement→ goto label {int i=lookup($2); if (i==0){/*该标号是首次出现*/ i=Enter($2);VarList[i].CAT=lab; VarList[i].DEF=0; VarList[i].ADDR=NXQ; GEN(j,0,0,0);} else /* 该标号已出现过*/ if (VarList[i].DEF) /*该标号已定义,可直接使用*/ GEN(j,0,0,VarList[i].ADDR); else { int n=NXQ;/*尚未定义,需拉链*/ GEN(j,0,0,VarList[i].ADDR); VarList[i].ADDR=n;} } * * 标号定义语句的翻译 LabelDef→ Label ‘:’ { int i=lookup($1); if (i==0) { i=Enter($1); VarList[i].CAT=lab; VarList[i].DEF=1; VarList[i].ADDR=NXQ;} else if(VarList[i].DEF) return ERROR;/*重复定义*/ else{VarLi

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档