编译原理教案8.9.pptVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理教案8.9

则把需回填E.true的四元式(10),(20)和(30) 链成   (10) … goto (0)    …   (20) … goto (10)    …   (30) … goto (20) 把地址(30)称作链首,0为链尾标志,即地址(10)为链尾。 如何描述回填,我们不再介绍,有兴趣的同学可阅读参考书。 8.6 控制语句的翻译 8.6.1条件转移   考虑if then,if then else和while do语句,在图8.12中已给出了它们的代码结构。这里我们使用下面文法G[S]定义这些语句: G[S]   (1) S→if E then S   (2) | if E then S else S   (3) | while E do S   (4) | begin L end   (5) | A   (6) L→L; S   (7) |S   其中各非终结符号的意义是:   S--语句   L--语句串   A--赋值句   E--布尔表达式 回想在上一节,按照上述文法产生式相应的语义动作,加上前述关于赋值句和布尔表达式的翻译法,语句   while (A<B) do if (C<D) then X∶=Y+Z   将被翻译成如下的一串四元式:   100 if A<B goto 102   101 goto 107   102 if C<D goto 104   103 goto 100   104 T∶=Y+Z   105 X∶=T   106 goto 100   107 8.6.2 开关语句   开关语句(case语句或switch语句)是很多程序设计语言中都有的,方式不尽相同,甚至FORTRAN中的计算GOTO和赋值GOTO也可看做是一种开关语句。 我们假定要讨论的开关语句的形式为:   switch E of   case V1:S1   case V2:S2   …   case Vn-1:Sn-1   default:Sn   end   这里的E是一个表达式,也称为选择子。开关语句是分情形选择机制,在E被计算之后,测试它的值符合哪种case中的值,而执行和该值相关的语句,并做相应的转移。如果E的值不能与任何Vi(1≤i≤n-1)匹配,便执行default时的语句。 直观上看,case语句翻译成如下的一连串条件转移语句。   t∶=E;   L1:if t≠V1 goto L2;   S1;   goto next;   L2:if t≠V2 goto L3;   S2   goto next;   …   Ln-1:if t≠Vn-1 goto Ln;   Sn-1;   goto next;   Ln:Sn;   next: 9.1 符号表的作用和地位   在编译程序中符号表用来存放语言程序中出现的有关标识符的属性信息,这些信息集中反映了标识符的语义特征属性。在词法分析及语法在分析过程中不断积累和更新表中的信息,并在词法分析到代码生成的各阶段,按各自的需要从表中获取不同的属性信息。不论编译策略是否分趟,符号表的作用和地位是完全一致的。   ① 收集符号属性   ② 上下文语义的合法性检查的依据   ③ 作为目标代码生成阶段地址分配的依据 ① 收集符号属性 编译程序扫描说明部分收集有关标识符的属性,并在符号表中建立符号的相应属性信息。例如,编译程序分析到下述两个说明语句   int A;   float B[5];   则在符号表中收集到关于符号A的属性是一个整型变量,关于符号B的属性是具有5个浮点型元素的一维数组。 ② 上下文语义的合法性检查的依据 同一个标识符可能在程序的不同地方出现,而有关该符号的属性是在这些不同情况下收集的。特别是在多趟编译及程序分段编译(在PASCAL及C中以文件为单位)的情况下,更需检查标识符属性在上下文中的一致性和合法性。通过符号表中属性记录可进行相应上下文的语义检查。 例如,在一个C语言程序中出现   …   int i [3,5]; //定义整型数组i   …   float i[4,2]; //定义实型数组i,重定义冲突   …   int i [3,5]; //定义整型数组i,重定义冲突   …   编译过程首先在符号表中记录了标识符i的属性是3×5个整型元素的数组,而后在分析第二、第三这两个定义说明时编译系统可通过符号表检查出标识符i的二次重定义冲突错误。本例还可以看到不论在后二句中i的其它属性与前一句是否完全相同,只要标识符名重定义,就将产生重定义冲突的语义错误。 程序设计语言中的表示 逆波兰表示 a+b a+b*c (a+b)*c a;=b*c+b*d ab+ abc*+ ab+c* abc*bd*+:

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档