- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Ch7语义分析的和中间代码产生
编译原理;本章在编译程序中的地位;CH.7 语义分析和中间代码的产生;语义分析和中间代码的产生;静态语义检查;教学要求;教学内容; 7.1 中间语言 ; 后缀式的定义(P167.); 后缀式:例;写后缀式:练习; 把表达式翻译为后缀式的语义规则描述(属性文法); 7.1.2 图表示法; 图表示法:DAG; 抽象语法树
公共子表达式
重复出现;(b) DAG
公共子表达式只出现一次,一个结点可以有多个父结点; 后缀式与抽象语法树(DAG)的关系;表7.2 产生赋值语句的抽象语法树
的属性文法(P169.);抽象语法树或DAG的表示法: 图7.4; 上次课主要内容(1); 7.1.3 三地址代码;三地址代码:说明;例, P170.图7.5,是相应于P168.图7.3的抽象语法树和DAG的三地址代码:
(a) 对应抽象语法树的代码 (b) 对应DAG的代码
T1 := -c T1 := -c
T2 := b* T1 T2 := b*T1
T3 := -c T5 := T2+T2
T4 := b* T3 a := T5
T5 := T2+T4
a := T5
注: 临时变量的名字对应抽象语法树的内部结点(算符结点), 表达式中的每个运算都要引入一个新的临时变量存放计算结果, 要多少引入多少。;(1) 赋值语句 x := y op z ;
op是二元算术或逻辑运算符
(2) 赋值语句 x := op y ;
op是一元算符,如取负、逻辑非、移位及类型转换
(3) 复制语句 x := y;
(4) 无条件转移语句 goto L;
符号标号 L 代表存放中间代码的数组中三地址代码语句的下标
(5) 条件转移语句 if x relop y goto L ;
if a goto L ;
relop是关系运算符; a是布尔量;(6) 过程调用语句 param x; x是实参数
call p, n ; p过程名, n实参个数
过程返回语句 return y; y返回值, 可有可无
(7) 索引赋值 x := y[i]; =[ ]变址取数
x[i] := y ; [ ]=变址存数
(8) 地址和指针赋值 x := &y;
x := * y;
* x := y;
注:选择适当的算符集合是中间代码设计的重要问题,应该不大不小,足以实现源语言的操作运算。;1. 赋值语句的三地???代码结构:
对表达式E求值的三地址语句序列
① id := E T := E的值
id.place := T
② id := y 只一个三地址语句 id.place := y
2. 为赋值语句生成三地址代码的S-属性文法定义
见P171.表7.3;(1) E.place 表示存放E值的名字。
(2) E.code 表示对E求值的三地址语句序列。
(3) S.code 表示赋值句S的三地址语句序列。
(4) 函数 newtemp 产生一个新的临时变量。
(5) 过程 gen( , , , , ) 产生一个三地址语句。
例如 gen(x, ‘:=’, y, ‘+’, z) 生成 x := y + z
注:实际实现中,三地址语句序列往往是被存放到一个输出文件中,而不是将三地址语句序列置入code属性之中。参见P179.图7.10的翻译模式。;例. 翻译赋值语句 a:=b*-c+b*-c 为三地址代码
自下而上语法制导翻译,结
文档评论(0)