- 1、本文档共69页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
南开大学编译原理第四章课件PPT
类型转换例子 x := y + i * jx、y——实数i、j——整数 t1 := i int* j t3 := inttoreal t1 t2 := y real+ t3 x := t2 8.3.6 记录(结构)域的访问 保存每个域的类型和相对地址?符号表 lookup可用于域名字 独立符号表 t:符号表指针,record(t)?T.type 翻译p^.info + 1 p的类型pointer(record(t)) p^的类型record(t) 得到t?查找info域 8.4 布尔表达式的翻译 E→E or E | E and E | not E | (E) | id relop id | true | false 8.4.1 两种翻译方式 数值编码:0-false,非0-ture 控制流语句属性true——布尔表达式为真时跳转到的程序位置属性false——布尔表达式为假时跳转到的程序位置 短路求值 E1 or E2,E1=false才对E2求值 注意副作用问题:函数调用 8.4.2 用数值表示布尔值 a or b and not c ? t1 := not c t2 := b and t1 t3 := a or t2 a b ? if a b then 1 else 0 100: if a b goto 103 101: t := 0 102: goto 104 103: t := 1 104: 翻译模式 E→E1 or E2 { E.place = newtemp; emit(E.place ‘:=’ E1.place ‘or’ E2.place); } E→E1 and E2 { E.place = newtemp; emit(E.place ‘:=’ E1.place ‘and’ E2.place); } E→not E1 { E.place = newtemp; emit(E.place ‘:=’ ‘not’ E1.place); } E→( E1 ) { E.place = E1.place; } E→id1 relop id2 { E.place = newtemp; emit(‘if’ id1.place relop.op id2.place ‘goto’ nextstat + 3); emit(E.place ‘:=’ ‘0’); emit(‘goto’ nextstat + 2); emit(E.place ‘:=’ ‘1’); } E→true { E.place = newtemp; emit(E.place ‘:=’ ‘1’); } E→false { E.place = newtemp; emit(E.place ‘:=’ ‘0’); } 例8.3 翻译a b or c d and e f 100: if a b goto 103 107: t2 := 1 101: t1 := 0 108: if e f goto 111 102: goto 104 109: t3 := 0 103: t1 := 1 110: goto 112 104: if c d goto 107 111: t3 := 1 105: t2 := 0 112: t4 := t2 and t3 106: goto 108 113: t5 := t1 or t4 8.4.3 控制流语句的翻译 S→if E then S1 | if E then S1 else S2 | while E do S1 语法制导定义-if S→ if E then S1 E.true = newlabel; E.false = S.next; S1.next = S.next; S.code = E.code || gen(E.true ‘:’) || S1.code 语法制导定义-if-else S→if E then S1 else S2 E.true = newlabel; E.false = newlabel; S1.next = S.next; S2.next = S.next; S.code = E.code || gen(E.true ‘:’) || S1.code || gen(‘goto’ S.next) || gen(E.false ‘:’) ||S2.code 语法制导定义 S→while E do S1 S.begin = newlabel; E.true = newlabel; E.false = S.next;
文档评论(0)