第5章 语义分析及中间代码生成.ppt

  1. 1、本文档共70页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章 语义分析及中间代码生成

操作符 左操作符数 右操作数 表达式的三元式: w*x+(y+z) (1) *, w, x (2) +, y, z (3) +, (1), (2) 第三个三元 式中的操作数(1) (2)表示第(1)和第 (2)条三元式的计 算结果。 三元式 例: A=B+C*D/E F=C*D 三元式 (1) *, C, D (2) / , (1), E (3) +, B, (2) (4) =, A, (3) (5) *, C, D (6) =, F, (1)   不便于代码优化:删除某些三元式后可能需作一系列的修改 三元式 (1) *, C, D (2) / , (1), E (3) +, B, (2) (4) =, A, (3) (5) =, F, (1) 间接三元式 执行顺序 (1) (2) (3) (4) (1) (5) 三元式的执行次序用另一张表表示, 优化时三元式可以不变,仅仅改变其执行顺序表 例:x =?y +y?z + y?z 抽象语法树 5.3.3 图形表示 有向无环图 5.9 PL/0编译程序的语义分析 特点:将语义子程序嵌入到每个递归过程中,通过递归子程序内部的局部量和参数传递语义信息。 对于某个产生式,不必产生式右部所有符号扫描后再处理,可在处理一个符号后,随时加进有关该符号的语义子程序。 自顶向下语法制导翻译 回忆“4.7 PL/0编译程序的语法分析”(见第4章讲义) 说明部分 5.9.1 说明部分的分析 对每个过程的说明对象填写符号表 具体要填写标识符的名字、属性、所在层次和分配的相对位置等 标识符的属性不同时,所需要填写的信息也有所不同 符号表的填写是由enter函数来完成的 enum object{constant,variable,procedure}; //枚举定义常量、变量和过程 enum object kind; struct table1 //符号表为结构体型数据 {char name [AL]; //标识符名字,最长为AL,已定义为10 enum object kind; //标识符名字的属性,为常量、变量或过程 int val,level,adr, size; }; struct table1 table[TXMAX+1]; //符号表用一维数组table来表示,最多有TXMAX项,TXMAX已定义为100 const a=35,b=49; var c,d,e; procedure p; var g name kind level/val adr size 表格管理 变量定义语句的处理 if(strcmp(sym,varsym)==0){ getsym(); do{ vardeclaration( );//处理一个变量 while (strcmp(sym,comma)==0){ getsym(); vardeclaration( ); } if (strcmp(sym,semicolon)==0) getsym(); else error(5); }while (strcmp(sym,ident)==0); } if(strcmp(sym,varsym)==0){ /* 遇到变量说明符号,处理变量说明 */ getsym(); do{ vardeclaration(); /* 处理一个变量 */ while (strcmp(sym,comma)==0){ getsym(); vardeclaration(); } if(strcmp(sym,semicolon)==0) getsym(); else error(5); /* 漏掉了,或; */ }while (strcmp(sym

文档评论(0)

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

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

1亿VIP精品文档

相关文档