- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理考虑如下语句生成下列代码编译原理一遍扫描翻译控制流语句考虑下列产生式所定义的语句表示语句表示语句表为赋值语句为一个布尔表达式编译原理语句的翻译相关产生式改写后产生式编译原理翻译模式编译原理语句的翻译相关产生式翻译为的代码的代码真出口假出口为了便于回填改写产生式为编译原理翻译模式编译原理产生式改写为编译原理翻译模式编译原理其它几个语句的翻译编译原理翻译语句编译原理翻译语句编译原理标号与语句标号定义形式标号引用示例向后转移向前转移编译原理符号表信息名字类型定义否地址标号已未编译原理产生式的语
编译原理 考虑如下语句 : while ab do if cd then x:=y+z else x:=y-z 生成下列代码: L1: if ab goto L2 goto Lnext L2: if cd goto L3 goto L4 L3: T1:=y+z x:=T1 goto L1 L4: T2:=y-z x:=T2 goto L1 Lnext: 编译原理 一遍扫描翻译控制流语句 考虑下列产生式所定义的语句: (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为一个布尔表达式 编译原理 if 语句的翻译 相关产生式 S → if E then S(1) | if E then S(1) else S(2) 改写后产生式 S → if E then M S1 S → if E then M1 S1 N else M2 S2 M→? N→? 编译原理 翻译模式: 1. S→if E then M S1 { backpatch(E.truelist, M.quad); S.nextlist:=merge(E.falselist, S1.nextlist) } 2. S→if E then M1 S1 N else M2 S2 { backpatch(E.truelist, M1.quad); backpatch(E.falselist, M2.quad); S.nextlist:=merge(S1.nextlist, N.nextlist, S2.nextlist) } 3. M→? { M.quad:=nextquad } 4. N→? { N.nextlist:=makelist(nextquad); emit(‘j,-,-,-’) } 编译原理 while 语句的翻译 相关产生式 S→ while E do S(1) 翻译为: E的代码 S (1)的代码 “真”出口 “假”出口 为了便于回填,改写产生式为: S→while M1 E do M2 S1 M→? 编译原理 翻译模式: 1. S→while M1 E do M2 S1 { backpatch(S1.nextlist, M1.quad); backpatch(E.truelist, M2.quad); S.nextlist:=E.falselist emit(‘j,-,-,’ M1.quad) } 2. M→? { M.quad:=nextquad } 编译原理 产生式 L→L;S 改写为: L→L1; M S M→? 编译原理 翻译模式: 1. L→L1; M S { backpatch(L1.nextlist, M.quad); L.nextlist:=S.nextlist } 2. M→? { M.quad:=nextquad } 编译原理 其它几个语句的翻译 1. S→begin L end { S.nextlist:=L.nextlist } 2. S→A { S.nextlist:=makelist( ) } 3. L→S { L.nextlist:=S.nextlist } 编译原理 翻译语句 while (ab) do if (cd) then x:=y+z; P190 (5) E→id1 relop id2 { E.truelist:=makelist(nextquad); E.falselist:=makelist(nextquad+1); emit(‘j’ relop.op ‘,’ id 1.place ‘,’ id 2.place‘,’ ‘0’); emit(‘j, -, -, 0’) } P179 S→id:=E { p:=lookup(id.name); if p?nil then emit(p ‘:=’ E.place) else error } E→E1+E2 { E.place:=newtemp; emit(E.place ‘:=’ E1.place ‘+’ E2.place)} P195 S→if E then M S1 {
文档评论(0)