《编译原理教程》习题解析与上机指导(第四版) 第七章

合集下载

编译原理 第7章习题解答

编译原理 第7章习题解答

第七章习题解答7.1 给定文法:S→(A)A→ABBA→BB→bB→c①构造它的基本LR(0)项目集;②构造它的LR(0)项目集规范族;③构造识别该文法活前缀的DFA;④该文法是SLR文法吗?若是,构造它的SLR分析表。

7.2 给定文法:E→EE+E→EE*E→a①构造它的LR(0)项目集规范族;②它是SLR(1)文法吗?若是,构造它的SLR(1)分析表;③它是LR(1)文法吗?若是,构造它的LR(1)分析表;④它是LALR(1)文法吗?若是,构造它的LALR分析表。

7.3 给出一个非LR(0)文法。

7.4 给出一个SLR(1)文法,但它不是LR(0)文法,构造它的SLR分析表。

7.5 给出一个LR(1)文法,但它不是LALR(1)文法,构造它的规范LR(1)分析表。

7.6 给定二义性文法:① E→E+E② E→E*E③ E→(E)④ E→id用所述的无二义性规则和(或)另加一些无二义性规则,例如,给算符*、+施加某种结合规则。

①构造它的LR(0)项目集规范族及识别活前缀的DFA;②构造它的LR分析表。

习题参考答案7.1 解:文法的基本LR(0)项目集为S→.(A) S→(.A) S→(A.) S→(A).A→.ABB A→A.BB A→AB.B A→ABB.A→.B A→B. B→.b B→b.B→.c B→c.构造该文法的识别活前缀的DFSA如下图所示:I文法的识别活前缀的DFSA该文法的LR(0)项目集规范族={I0,I1,I2,I3,I4,I5,I6,I7,I8}因为在构造出来的识别活前缀的DFA中,每一个状态对应的项目集都不含有移进-归约、归约-归约冲突,所以该文法是LR(0)文法,当然也是SLR文法。

因为 FOLLOW(S)={#}FOLLOW(A)=FIRST{)}∪FIRST(BB)={),b,c}FOLLOW(B)=FIRST(B)∪FOLLOW(A)={b,c,)}其对应的SLR(1)分析表如下表所示。

编译原理清华大学出版社第7章习题重点题解答

编译原理清华大学出版社第7章习题重点题解答

1S → a | ∧ | ( T )T → T , S | S解:(1) 增加辅助产生式 S’→#S#求 FIRSTVT集FIRSTVT(S’)= {#}FIRSTVT(S)= {a ∧ ( }FIRSTVT (T) = {,} ∪ FIRSTVT( S ) = { , a ∧ ( }求 LASTVT集LASTVT(S’)= { # }LASTVT(S)= { a ∧ )}LASTVT (T) = { , a ∧ )}(2)算符优先关系表a ∧( ) , #a ·> ·> ·> ∧·> ·> ·> ( <·<·<·=·<·) ·> ·> ·>, <·<·<··> ·># <·<·<·=·因为任意两终结符之间至多只有一种优先关系成立,所以是算符优先文法(3)a ∧( ) ,F 1 1 1 11 1g 1 1 1 11 1f 2 2 1 3 2g 2 2 2 1 2f 3 3 1 3 3g 4 4 4 1 2f 3 3 1 3 3g 4 4 4 1 2(4)栈优先关系当前符号剩余输入串移进或规约#<·( a,a)#移进#( <· a,a)# 移进# (a ·> , a)# #(T <·, a)# #(T,<· a )# #(T,a ·> ) # #(T,T ·> ) # #(T =·) # #(T) ·> ##T =·#4.扩展后的文法S’→#S# S→S;G S→G G→G(T)G→H H→a H→(S)T→T+S T→S(1)FIRSTVT(S)={;}∪FIRSTVT(G) = {; , a , ( } FIRSTVT(G)={ ( }∪FIRSTVT(H) = {a , ( } FIRSTCT(H)={a , ( }FIRSTVT(T) = {+} ∪FIRSTVT(S) = {+ , ; , a , ( }LASTVT(S) = {;} ∪LASTVT(G) = { ; , a , )}LASTVT(G) = { )} ∪LASTVT(H) = { a , )}LASTVT(H) = {a, )}LASTVT(T) = {+ } ∪LASTVT(S) = {+ , ; , a , ) }构造算符优先关系表; ( ) a + # ;·> <··> <··> ·> ( <·<·=·<·<·) ·> ·> ·> ·> ·> a ·> ·> ·> ·> ·> + <·<··> <··># <·<·<·=·因为任意两终结符之间至多只有一种优先关系成立,所以是算符优先文法(2)句型a(T+S);H;(S)的短语有:a(T+S);H;(S) a(T+S);H a(T+S) a T+S (S) H直接短语有: a T+S H (S)句柄: a素短语:a T+S (S)最左素短语:a(3)分析a;(a+a)栈优先关系当前符号剩余输入串移进或规约##a #T #T;#T;(<··><·<·<·a;;(a;(a+a)#(a+a)#(a+a)#a+a)#+a)#移进规约移进移进移进#T;(T #T;(T +#T;(T +a#T;(T +T#T;(T #T;(T)#T;T #T <·<··>·>=··>·>=·+a)))###a)#)####移进移进规约规约移进规约规约接受分析a;(a+a)栈优先关系当前符号剩余输入串移进或规约##(#(a #(T #(T+<·<··><·<·(a++aa+a)#+a)#a)#移进移进规约移进移进#(T+T #(T#(T)#T ·>=··>=·))##)####规约移进规约接受(4)不能用最右推导推导出上面的两个句子。

编译原理 第七章习题-推荐下载

编译原理 第七章习题-推荐下载

E:=A+D
G:=A
H:=G*G
F:=H*G
L:=F
M:=L
n6
1
n2/
1
C
n4
41+
n7
1
*
n5
1
D
G
E
(1) G:=B*C H:=G*G L:=G*H M:=L
n1
B
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术通关,1系电过,力管根保线据护敷生高设产中技工资术艺料0不高试仅中卷可资配以料置解试技决卷术吊要是顶求指层,机配对组置电在不气进规设行范备继高进电中行保资空护料载高试与中卷带资问负料题荷试2下卷2,高总而中体且资配可料置保试时障卷,各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看度并22工且22作尽22下可22都能22可地护以缩1关正小于常故管工障路作高高;中中对资资于料料继试试电卷卷保破连护坏接进范管行围口整,处核或理对者高定对中值某资,些料审异试核常卷与高弯校中扁对资度图料固纸试定,卷盒编工位写况置复进.杂行保设自护备动层与处防装理腐置,跨高尤接中其地资要线料避弯试免曲卷错半调误径试高标方中高案资等,料,编试要5写、卷求重电保技要气护术设设装交备备置底4高调、动。中试电作管资高气,线料中课并敷3试资件且、设卷料中拒管技试试调绝路术验卷试动敷中方技作设包案术,技含以来术线及避槽系免、统不管启必架动要等方高多案中项;资方对料式整试,套卷为启突解动然决过停高程机中中。语高因文中此电资,气料电课试力件卷高中电中管气资壁设料薄备试、进卷接行保口调护不试装严工置等作调问并试题且技,进术合行,理过要利关求用运电管行力线高保敷中护设资装技料置术试做。卷到线技准缆术确敷指灵设导活原。。则对对:于于在调差分试动线过保盒程护处中装,高置当中高不资中同料资电试料压卷试回技卷路术调交问试叉题技时,术,作是应为指采调发用试电金人机属员一隔,变板需压进要器行在组隔事在开前发处掌生理握内;图部同纸故一资障线料时槽、,内设需,备要强制进电造行回厂外路家部须出电同具源时高高切中中断资资习料料题试试电卷卷源试切,验除线报从缆告而敷与采设相用完关高毕技中,术资要资料进料试行,卷检并主查且要和了保检解护测现装处场置理设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

编译原理作业集-第七章(DOC)

编译原理作业集-第七章(DOC)

第七章语义分析和中间代码产生本章要点1. 中间语言,各种常见中间语言形式;2. 说明语句、赋值语句、布尔表达式、控制语句等的翻译;3. 过程调用的处理;4. 类型检查;本章目标掌握和理解中间语言,各种常见中间语言形式;各种语句到中间语言的翻译;以及类型检查等内容。

本章重点1.中间代码的几种形式,它们之间的相互转换:四元式、三元式、逆波兰表示;3.赋值语句、算术表达式、布尔表达式的翻译及其中间代码格式;4.各种控制流语句的翻译及其中间代码格式;5.过程调用的中间代码格式;6.类型检查;本章难点1. 各种语句的翻译;2. 类型系统和类型检查;作业题一、单项选择题:1. 布尔表达式计算时可以采用某种优化措施,比如A and B用if-then-else可解释为_______。

a. if A then true else B;b. if A then B else false;c. if A then false else true;d. if A then true else false;2. 为了便于优化处理,三地址代码可以表示成________。

a. 三元式b. 四元式c. 后缀式d. 间接三元式3. 使用三元式是为了________:a. 便于代码优化处理b. 避免把临时变量填入符号表c. 节省存储代码的空间d. 提高访问代码的速度4. 表达式-a+b*(-c+d)的逆波兰式是________。

a. ab+-cd+-*;b. a-b+c-d+*;c. a-b+c-d+*;d. a-bc-d+*+;5. 赋值语句x:=-(a+b)/(c-d)-(a+b*c)的逆波兰式表示是_______。

a. xab+cd-/-bc*a+-:=;a. xab+/cd-bc*a+--:=;a. xab+-cd-/abc*+-:=;a. xab+cd-/abc*+--:=;6. 在一棵语法树中结点的继承属性和综合属性之间的相互依赖关系可以由________来描述。

编译原理第7章答案

编译原理第7章答案

第七章LR分析法1.已知文法A→aAd|aAb|ε判断该文法是否是SLR(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。

解:增加一个非终结符S/后,产生原文法的增广文法有:S/→AA→aAd|aAb|ε下面构造它的LR(0)项目集规范族为:02对于I0来说有FOLLOW(A)∩{a}={b,d,#}∩{a}=Φ所以在I0状态下面临输入符号为a时移进,为b,d,#时归约,为其他时报错。

对于I2来说有也有与I0完全相同的结论。

这就是说,以上的移进-归约冲突是可以解决的,因此该文法是SLR(1)文法。

其他SLR(1)分析表为:下面构造它的SLR(1)项目集规范族为:15S→a|^|(T)T→T,S|S(1)构造它的LR(0),LALR(1),LR(1)分析表。

(2)给出对输入符号串(a#和(a,a#的分析过程。

(3)说明(1)中三种分析表发现错误的时刻和输入串的出错位置有何区别。

解:(1)加入非终结符S/,方法的增广文法为:S/→SS→aS→^S→(T)T→T,ST→S下面构造它的LR(0)项目集规范族为:表7.15.1 文法的LR(0)分析表17.若包含条件语句的语句文法可缩写为:S→iSeS|iS|S;S|a其中:i代表if,e代表else,a代表某一语句。

若规定:(1)else与其左边最近的if结合(2);服从左结合试给出文法中i,e,; 的优先关系,然后构造出无二义性的LR分析表,并对输入串iiaea#给出分析过程。

解:加入S/→S产生式构造出增广文法如下:[0] S/→S[1] S→iSeS[2] S→iS[3] S→S;S[4] S→a由习惯可知,定义文法中i,e,;,a4个算符的优先关系为:a>e>i>;。

并且i与;的结合方向均为自左至右。

由上述状态项目集可见:a.状态I1存在移进-归约冲突,由于FOLLOW(S/)∩{;}={#}∩{;}=Φ,所以面临#号时应acc,面临;号时应移进。

编译原理习题及答案(课堂PPT)

编译原理习题及答案(课堂PPT)
这两种途径的主要区别在于:解释方式下不生成目 标代码程序,而编译方式下生成目标代码程序。
.
8
《编译原理教程》习题解析
9
1.3 请画出编译程序的总框图。如果你是一个编译程 序的总设计师,设计编译程序时应当考虑哪些问题?
【解答】 编译程序总框图如图1-1所示。 作为一个编译程序的总设计师,首先要深刻理解被编 译的源语言其语法及语义;其次,要充分掌握目标指令的 功能及特点,如果目标语言是机器指令,还要搞清楚机器 的硬件结构以及操作系统的功能;第三,对编译的方法及 使用的软件工具也必须准确化。总之,总设计师在设计编 译程序时必须估量系统功能要求、硬件设备及软件工具等 诸因素对编译程序构造的影响。
《编译原理教程》习题解析
1
第一章 绪 论 第二章 词 法 分 析 第三章 语 法 分 析
.
1
《编译原理教程》习题解析
2
第一章 绪 论
1.1 完成下列选择题: (1) 下面叙述中正确的是 。
A.编译程序是将高级语言程序翻译成等价的机 器语言程序的程序
B.机器语言因其使用过于困难,所以现在计算 机根本不使用机器语言
.
5
《编译原理教程》习题解析
6
(4) 编译各阶段的工作都涉及到构造、查找或更新有 关表格,即编译过程的绝大部分时间都用在造表、查表和 更新表格的事务上。故选D。
(5) 由(1)可知,编译程序实际上实现了对高级语言程 序的翻译。故选D。
.
6
《编译原理教程》习题解析
7
1.2 计算机执行用高级语言编写的程序有哪些途径?它们 之间的主要区别是什么?
.
12
《编译原理教程》习题解析
13
图2-1 习题2.1的DFA M

编译原理第四版课后答案

编译原理第四版课后答案

编译原理第四版课后答案编译原理是计算机科学与技术专业的一门重要课程,它主要研究的是编译程序的设计与实现。

编译原理第四版是一本经典的教材,它包含了大量的课后习题,这些习题对于学生来说是非常重要的。

因此,在这里我整理了编译原理第四版课后习题的答案,希望能够对大家的学习有所帮助。

1. 什么是编译原理?编译原理是研究如何将高级语言程序翻译成等价的目标程序的一门学科。

它主要包括词法分析、语法分析、语义分析、中间代码生成、代码优化和代码生成等内容。

2. 为什么要学习编译原理?学习编译原理可以帮助我们更好地理解计算机程序的运行原理,提高我们的程序设计和优化能力。

同时,编译原理也是计算机科学与技术专业的一门重要课程,掌握好这门课程对我们日后的学习和工作都是非常有帮助的。

3. 词法分析的作用是什么?词法分析的作用是将源程序中的字符序列转换成单词序列,同时识别出每个单词的词法属性。

词法分析器通常会将源程序中的字符序列划分为一个个的单词,并且识别出每个单词的类别,比如关键字、标识符、常数、运算符等。

4. 语法分析的作用是什么?语法分析的作用是将词法分析得到的单词序列转换成语法树或者语法分析树。

语法分析器通常会根据语法规则来判断源程序是否符合语法规范,如果符合则将其转换成语法树,如果不符合则报告语法错误。

5. 语义分析的作用是什么?语义分析的作用是对源程序进行语义检查,判断源程序是否符合语义规范。

语义分析器通常会对词法分析和语法分析得到的结果进行进一步的处理,比如类型检查、作用域检查、中间代码生成等。

6. 中间代码生成的作用是什么?中间代码生成的作用是将源程序转换成等价的中间代码表示形式。

中间代码通常是一种抽象的表示形式,它可以方便地进行代码优化和代码生成。

7. 代码优化的作用是什么?代码优化的作用是对中间代码进行优化,使得生成的目标代码更加高效。

代码优化通常会涉及到各种优化技术,比如常量传播、死代码删除、循环优化等。

编译原理-第七章解析资料

编译原理-第七章解析资料

中间代码 中间 中间代码 生成器 代码 优化器
静态语义检查和中间代码生成器的位置
2018/10/26
TJNU-COCIE-WJW
5
第七章 语义分析和中间代码产生
中间语言 7.2 说明语句 7.3 赋值语句的翻译 7.4 分情况语句 7.5 回填技术 7.6 类型检查
7.1
2018/10/26 TJNU-COCIE-WJW 6
TJNU-COCIE-WJW 28
2018/10/26
例子:语句a:=b*-c+b*-c 的三元式表示
op arg1 arg2
(0) (1) (2) (3) (4) (5)
uminus * uminus * + Assign
c b c b
(1)
(0) (2) (3) (4)
a
2018/10/26
TJNU-COCIE-WJW
例:x
+ y * z翻译成 t1 := y * z t2 := x + t1
TJNU-COCIE-WJW 16
2018/10/26
1.一般形式(续)
三地址代码是AST或DAG的线性化表示

DAG图对应的三地址代码可能比相应的AST
对应的三地址代码要优化,因为可以复用中 间结果
2018/10/26
29
注意: 有些三地址语句要多个三元式表示 例子: x[i] := y op arg1 arg2 (0) [ ]= x i (1) := (0) y
y := x[i] op arg1 (0) =[ ] x (1) := y arg2 i (0)
2018/10/26
TJNU-COCIE-WJW

编译原理王生原课后习题第七章

编译原理王生原课后习题第七章

编译原理模拟试卷一、选择题(每题1分,共5分)1.在编译过程中,词法分析的主要任务是什么?A.构建语法树B.将源程序分解为单词序列C.语义分析D.代码2.下列哪个不属于编译器的组成部分?A.词法分析器B.语法分析器C.代码器D.数据库管理系统3.在编译器中,中间代码的作用是什么?A.提高编译速度B.方便目标代码C.提高程序的可读性4.下列哪种语言通常被用作编译器的实现语言?A.PythonB.JavaC.C++5.在编译原理中,形式语言的主要作用是什么?A.描述程序设计语言的语法B.描述程序的语义C.描述程序的数据结构D.描述程序的算法二、判断题(每题1分,共5分)1.编译器的主要任务是将源程序转换为目标代码。

(正确/错误)2.语法分析器负责检查源程序中的语法错误。

(正确/错误)3.语义分析是在语法分析之后进行的。

(正确/错误)4.中间代码是一种与机器无关的代码。

(正确/错误)5.代码优化不会影响程序的正确性。

(正确/错误)三、填空题(每题1分,共5分)1.编译器包括____、____、____、____等组成部分。

2.在编译过程中,____负责将源程序分解为单词序列。

3.语法分析器的主要任务是构建____。

4.语义分析器负责检查____。

5.代码器负责____。

四、简答题(每题2分,共10分)1.简述编译器的工作流程。

2.解释什么是词法分析。

3.什么是语法分析?它的主要任务是什么?4.什么是语义分析?它的主要作用是什么?5.简述中间代码的作用。

五、应用题(每题2分,共10分)1.给出一个简单的C语言程序,请描述它通过编译器的过程。

2.什么是编译器的优化?请给出一个例子。

3.解释什么是编译器的错误处理。

4.什么是编译器的调试信息?它的作用是什么?5.请解释编译器的前端和后端。

六、分析题(每题5分,共10分)1.分析并解释编译器中的词法分析、语法分析和语义分析之间的关系。

2.分析并解释编译器中的中间代码和目标代码之间的关系。

《编译原理》课程习题

《编译原理》课程习题

第一章编译程序概述1.1 什么是编译程序编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都含有不止一个高级语言的编译程序。

对有些高级语言甚至配置了几个不同性能的编译程序。

1.2编译过程概述和编译程序的结构编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。

从概念上来讲,一个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的。

一般一个编译过程划分成词法分析、语法分析、语义分析、中间代码生成,代码优化和目标代码生成六个阶段,这是一种典型的划分方法。

事实上,某些阶段可能组合在一起,这些阶段间的源程序的中间表示形式就没必要构造出来了。

我们将分别介绍各阶段的任务。

另外两个重要的工作:表格管理和出错处理与上述六个阶段都有联系。

编译过程中源程序的各种信息被保留在种种不同的表格里,编译各阶段的工作都涉及到构造、查找或更新有关的表格,因此需要有表格管理的工作;如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动校正错误,这些工作称之为出错处理。

图1.1表示了编译的各个阶段。

图1.1 编译的各个阶段1.3 高级语言解释系统为了实现在一个计算机上运行高级语言的程序,主要有两个途径:第一个途径是把该程序翻译为这个计算机的指令代码序列,这就是我们已经描述的编译过程。

第二个途径是编写一个程序,它解释所遇到的高级语言程序中的语句并且完成这些语句的动作,这样的程序就叫解释程序。

从功能上说,一个解释程序能让计算机执行高级语言。

它与编译程序的主要不同是它不生成目标代码,它每遇到一个语句,就要对这个语句进行分析以决定语句的含义,执行相应的动作。

第二章:高级语言及其语法描述问答第1题写一文法,使其语言是偶正整数的集合。

编译原理例题习题讲解(ch6-ch7)

编译原理例题习题讲解(ch6-ch7)

7、文法如下: PD DD;D|id:T|proc id;D;S (1)设计语法制导定义,打印该程序一共声明的 id 个数 (2)设计翻译模式,打印 P 所生成的程序中每个 id 的嵌套深度 解:
(1) 语法制导定义:引入属性 i,记录 id 的个数 PD {printf(D.i);} DD1;D2 {D.i=D1.i+D2.i;} Did:T {D.i=1;} Dproc id;D1;S {D.i=D1.i+1} (2)翻译模式:引入属性 level 和 name P{D.level=1;}D D{D1.level=D.level; }D1;{ D2.level=D.level;}D2 Did:T {printf(,D.lev);} Dproc id; {D1.level=D.level+1; }D1;S 8、请将下列语句 while (A<B )do if (C>D) then X:=Y+Z 翻译成四元式 解:翻译的三地址码序列: L1: if A<B goto L1 goto L4 L2: if C<D goto L3 goto L1 L3:T∶=Y+Z X∶=T goto L1 L4:
9、将下列C程序的执行语句翻译成三地址代码(设 S.next 为 L0):
if( i < j ) s = 10 * s else i=-j 解:翻译的三地址码序列: if i < j goto L1 goto L2 L1: t0 = 10 * s s = t0 goto L0 L2: t1 = - j i = t1 L0: ...
S’S {print(S.val);} SL1.L2 { S.val:=L1.val+L2.val/2L2.length ;} S L { S.val:=L.val; } LL1B { L.val:=L1.val*2+B.val; L.length:=L1.length+1; } LB { L.val:=B.val; L.length:=1;} B0 { B.val:=0; } B1 { B.val:=1;}

编译原理第7章 习题与答案

编译原理第7章 习题与答案

第7章习题7-1 设有如下的三地址码(四元式)序列:read NI:=NJ:=2L1 : if I≤J goto L3L2 : I:=I-Jif I>J goto L2if I=0 goto L4J:=J+1I:=Ngoto L1L3 : Print ′YES′haltL4 : Print ′NO′halt试将它划分为基本块,并作控制流程图。

7-2 考虑如下的基本块:D:=B*CE:=A+BB:= B*CA:=E+D(1) 构造相应的DAG;(2) 对于所得的DAG,重建基本块,以得到更有效的四元式序列。

7-3 对于如下的两个基本块:(1) A:=B*CD:=B/CE:=A+DF:=2*EG:=B*CH:=G*GF:=H*GL:=FM:=L(2) B:=3D:=A+CE:=A*CF:=E+DG:=B*FH:=A+CI:=A*CJ:=H+IK:=B*5L:=K+JM:=L分别构造相应的DAG,并根据所得的DAG,重建经优化后的四元式序列。

在进行优化时,须分别考虑如下两种情况:(ⅰ)变量G、L、M在基本块出口之后被引用;(ⅱ)仅变量L在基本块出口之后被引用。

7-4 对于题图7-4所示的控制流程图:(1) 分别求出它们各个结点的必经结点集;(2) 分别求出它们的各个回边;(3) 找出各流程图的全部循环。

7-5 对于如下的程序:I:=1read J,KL: A:=K*IB:=J*IC:=A*Bwrite CI:=I+1if A<100 goto Lhalt试对其中的循环进行可能的优化。

第8章习题答案7-1 解:划分情况及控制流程如答案图7-1所示:答案图7-1 将四元式序列划分为基本块7-2 解:(1) 相应的DAG如答案图7-2所示。

答案图7-2 DAG(2) 优化后的代码为:D:=B*CE:=A+BB:=DA:=E+D7-3 解:(1) 相应的DAG如答案图7-3-(1)所示。

若只有G、L、M在出口之后被引用,则优化后的代码为:G:=B*CH:=G*GL:=H*GM:=L若只有L在出口之后被引用,则代码为:G:=B*CH:=G*GL:=H*G(2) 相应的DAG如答案图7-3-(2)所示。

《编译原理教程》习题解析与上机指导(第四版) 胡元义章 (7)

《编译原理教程》习题解析与上机指导(第四版) 胡元义章 (7)
8086/8088指令系统的编码格式非常紧凑并且灵活,其 机器码指令长度为1~6个字节(不包括前缀),通常指令的第一 字节为操作码,用以规定操作的类型,第二字节规定操作数的 寻址方式。
典型的单操作数指令结构如图12-1所示。
第十二章 8086/8088小汇编的设计与实现
第十二章 8086/8088小汇编的设计与实现
的数和所需保存的结果,这就需要三个操作数,可以规定把加 得的结果存入到两个相加数的位置之一,从而使操作数减少为 两个,这两个操作数就分别称为源操作数和目的操作数。源操 作数与目的操作数相加的结果最终又送回到目的操作数,这意 味着原来目的操作数中存放的数据丢失了,但是这种情况无关 紧要,如果需要保留原来目的操作数的值,则可以在执行这条 指令之前将原目的操作数保存到其它寄存器或者存储器中。两 操作数指令的方法对于由许多指令组成的程序来说,所节省的 存储空间和送入CPU•的时间都是可观的。
第十二章 808பைடு நூலகம்/8088小汇编的设计与实现
第十二章 8086/8088小汇编的设计与实现
12.1 汇编指令系统的分析 12.2 8086/8088小汇编的设计实现 12.3 8086/8088小汇编实验 12.4 8086/8088小汇编程序
第十二章 8086/8088小汇编的设计与实现
12.1 汇编指令系统的分析 12.1.1 引言
(1) 能够满足CPU所寻址的最大地址空间,否则将存在 无法访问的地址。
第十二章 8086/8088小汇编的设计与实现
(2) 从速度和存储角度考虑,地址码不能占用太多的字 节。为减少地址码占用的字节数,就应采用多种寻址方式。
(3) 尽量满足高级语言中各种数据结构的寻址需要。以 数组元素A[I]为例,位移量对应数组A的开始地址,变址I(表 示数组A的第I个元素)的位距值存放在寄存器(如SI)中,则对 数组元素A[I]的访问地址应是“寄存器(SI)+位移”;有时位 移量是在基址寄存器(如BX)中,则A[I]的访问地址是“寄存器 (BX)+寄存器(SI)”;如果A[I]出现在递归子程序调用中,则 数据是以堆栈形式来逐层存储的,故访问数组元素A[I]时还需 由堆栈指针(如BP)来指示是哪一层子程序调用中的A[I],其地 址应为“寄存器(BP)+寄存器(SI)+位移”。由此可见,至少要 有如上所述的几种寻址方式才能满足程序语言的特殊使用(数 组、递归子程序)要求。

编译原理 第七章 习题解答

编译原理 第七章 习题解答

第七章习题答案1.拓广该文法:(0) S→A (1)A→aAd (2)A→aAb (3)A→ε构造LR(0)项目集规范族如下:由图可知,在项目集I0、I2中存在移进-归约冲突,该文法不是LR(0)文法。

在I0中,移进符号为a,而归约符号为Follow(A)={b,d,#},交集为空,可以解决冲突;在I2中,移进符号为a,而归约符号为Follow(A)={b,d,#},交集为空,可以解决冲突。

因此,该文法是SLR(1)文法。

输入串ab#的分析过程7.拓广该文法:(0) S’→S (1) S→A (2)A→Ab (3)A→bBa(4)B→aAc (5)B→a (6)B→aAb构造LR(0)项目集规范族如下:由图可知,在项目集I2、I6中存在移进-归约冲突,该文法不是LR(0)文法。

Follow(S’)={#}Follow(S)=Follow(S’)={#}Follow(A)=Follow(S)∪{b,c}={b,c,#}Follow(B)={a}在I2中,移进符号为b,归约符号为Follow(S)={#},交集为空,可以解决冲突;在I6中,移进符号为b,归约符号为Follow(B)={a},交集为空,可以解决冲突。

因此,该文法为SLR(1)文法。

8.拓广该文法:(0) S’→S (1) S→A$ (2)A→BaBb(3)A→DbDa (4)B→ε(5)D→ε构造LR(0)项目集规范族如下:由图可知,在项目集I0中存在归约-归约冲突,该文法不是LR(0)文法。

Follow(S’)={#}Follow(S)=Follow(S’)={#}Follow(A)= {$}Follow(B)={a,b}Follow(D)={a,b}在I 0中,归约项目B→·的归约符号集为Follow(B)={a,b},归约项目D→·的归约符号集为{a,b},交集不为空,因此,该文法不是SLR(1)文法。

构造LR(1)项目集规范族如下:由图可知,不存在任何冲突,该文法是LR(1)文法。

编译原理第四版课后答案

编译原理第四版课后答案

编译原理第四版课后答案1. 什么是编译原理?编译原理是计算机科学中的一个重要领域,它研究的是编译器的设计和实现原理。

编译器是将高级语言代码转换成机器语言代码的程序,它起着将程序员编写的高级语言代码翻译成计算机能够理解和执行的机器语言代码的作用。

编译原理涉及到词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等方面的内容。

2. 什么是词法分析?词法分析是编译过程中的第一个阶段,它的主要任务是将源代码中的字符序列转换成单词序列。

在词法分析中,我们需要识别出各种关键字、标识符、常量、运算符等单词,并将它们转换成词法单元。

词法分析器通常使用有限自动机或正则表达式来实现。

3. 什么是语法分析?语法分析是编译过程中的第二个阶段,它的主要任务是将词法分析得到的词法单元序列转换成抽象语法树。

在语法分析中,我们需要根据语言的文法规则来识别各种语法结构,并将其转换成抽象语法树。

语法分析器通常使用上下文无关文法或者递归下降分析法来实现。

4. 什么是语义分析?语义分析是编译过程中的第三个阶段,它的主要任务是对抽象语法树进行语义检查,并生成中间代码。

在语义分析中,我们需要检查诸如类型匹配、变量声明、作用域等语义规则,并将其转换成中间代码。

语义分析器通常使用符号表和类型检查来实现。

5. 什么是中间代码生成?中间代码生成是编译过程中的第四个阶段,它的主要任务是将抽象语法树转换成中间代码。

在中间代码生成中,我们需要将高级语言的抽象语法树转换成类似于三地址码、四地址码或者虚拟机指令等中间代码表示形式。

中间代码生成器通常使用栈式虚拟机或者三地址码表示法来实现。

6. 什么是代码优化?代码优化是编译过程中的第五个阶段,它的主要任务是对中间代码进行优化。

在代码优化中,我们需要对中间代码进行各种优化操作,以提高程序的执行效率。

常见的代码优化包括常量传播、死代码消除、循环优化等。

7. 什么是目标代码生成?目标代码生成是编译过程中的最后一个阶段,它的主要任务是将中间代码转换成目标机器的机器代码。

编译原理 第七章习题

编译原理 第七章习题

1.给出下面表达式的逆波兰表示(后缀式):a*(-b+c)a+b*(c+d/e)not A or not(C or not D)(A and B)or (not C or D)后缀式分别为:ab-c+*abcde/+*+A not CD not or not orAB and C not D or or3. 请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式和四元式序列。

三元式:(0)(+,a, b)(1) ( -, (0), _)(2) (+, c, d)(3) (*,(1),(2))(4)(+,a, b)(5) (+, (4), c)(6) (-,(3),(5))间接三元式:(1)(+,a, b)(2) ( -, (1), _)(3) (+, c, d)(4) (*,(2),(3))(5) (+, (1), c)(6) (-,(4),(5))间接代码:(1)(2)(3)(4)(1)(5)(6)四元式:(0)(+,a, b, T1)(1)(-,T1, _, T2)(2)(+,c, d, T3)(3)(*, T2, T3, T4)(4)(+,a, b, T5)(5)(+,T5, c, T6)(6)(-,T4,T6,T7)7.用7.5.1节的方法,把下面语句翻译成四元式序列:While A<C and B<D doIf A=1 then C:=C+1Else while A≤D do A:=A+2;100 (j<, A,C,102)101 (j , _, _, 115)102 (j<,B,D,104)103 (j ,_, _, 115)104 (j=,A, 1, 106)105 (j , _, _, 109)106 (+, C, 1, T1)107 (:=, T1,_, C)108 (j , _, _, 114)109 (j≤,A,D,111)110 (j , _, _, 115)111 (+, A, 2, T2)112 (:=,T2, _, A)113 (j ,_, _, 109)114 (j , _, _,100)115第十章3.试对以下基本块B1和B2:B1:A:=B*CD:=B/CF:=2*EG:=B*CH:=G*GF:=H*GL:=FM:=LB2:B:=3D:=A+CE:=A*CG:=B*FH:=A+CI:=A*CJ:=H+IK:=B*5L:=K+JM:=L分别应用DAG对它们进行优化,并就以下两种情况分别写出优化后的四元式序列:(1)假设只有G,L,M在基本块后面还要被引用;(2)假设只有L在基本块后面还要被引用。

编译原理习题集与答案解析(整理后)

编译原理习题集与答案解析(整理后)

编译原理习题集与答案解析(整理后)第⼀章1、将编译程序分成若⼲个“遍”是为了。

a.提⾼程序的执⾏效率b.使程序的结构更加清晰c.利⽤有限的机器内存并提⾼机器的执⾏效率d.利⽤有限的机器内存但降低了机器的执⾏效率2、构造编译程序应掌握。

a.源程序b.⽬标语⾔c.编译⽅法d.以上三项都是3、变量应当。

a.持有左值b.持有右值c.既持有左值⼜持有右值d.既不持有左值也不持有右值4、编译程序绝⼤多数时间花在上。

a.出错处理b.词法分析c.⽬标代码⽣成d.管理表格5、不可能是⽬标代码。

a.汇编指令代码b.可重定位指令代码c.绝对指令代码d.中间代码6、使⽤可以定义⼀个程序的意义。

a.语义规则b.语法规则c.产⽣规则d.词法规则7、词法分析器的输⼊是。

a.单词符号串b.源程序c.语法单位d.⽬标程序8、中间代码⽣成时所遵循的是- 。

a.语法规则b.词法规则c.语义规则d.等价变换规则9、编译程序是对。

a.汇编程序的翻译b.⾼级语⾔程序的解释执⾏c.机器语⾔的执⾏d.⾼级语⾔的翻译10、语法分析应遵循。

a.语义规则b.语法规则c.构词规则d.等价变换规则⼆、多项选择题1、编译程序各阶段的⼯作都涉及到。

a.语法分析b.表格管理c.出错处理d.语义分析e.词法分析2、编译程序⼯作时,通常有阶段。

a.词法分析b.语法分析c.中间代码⽣成d.语义检查e.⽬标代码⽣成三、填空题1、解释程序和编译程序的区别在于。

2、编译过程通常可分为5个阶段,分别是、语法分析、代码优化和⽬标代码⽣成。

3、编译程序⼯作过程中,第⼀段输⼊是,最后阶段的输出为程序。

4、编译程序是指将程序翻译成程序的程序。

单选解答1、将编译程序分成若⼲个“遍”是为了使编译程序的结构更加清晰,故选b。

2、构造编译程序应掌握源程序、⽬标语⾔及编译⽅法等三⽅⾯的知识,故选d。

3、对编译⽽⾔,变量既持有左值⼜持有右值,故选c。

4、编译程序打交道最多的就是各种表格,因此选d。

编译原理 第7章 习题解答

编译原理 第7章 习题解答

第1题已知文法A→aAd|aAb|ε判断该文法是否是SLR(1)文法,若是构造相应分析表,并对输入串ab#给出分析过程。

解:1、拓广文法为G′,增加产生式S′→A,若产生式排序为:0 S' →A1 A →aAd2 A →aAb3 A →ε2、构造G′的LR(0)项目集族及识别活前缀的DFA如下图所示:3、判定文法在I0、I2中:A →.aAd和A →.aAb为移进项目,A →.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。

Follow(S' ) = {#} Follow(A ) = Follow(S' )⋃ First (d ) ⋃ First (b )={d,b,#} 在I0、I2中:Follow(A) ∩{a}= {d,b,#} ∩{a}=所以在I0、I2中的移进-归约冲突可以由Follow集解决,所以G是SLR(1)文法。

4、构造的SLR(1)分析表如下:SLR(1)分析表状态(State)Action Gotoa db # A0 1 2 3 4 5 S2 r3 r3 r3AccS2 r3 r3 r3S4 S5r1 r1 r1r2 r2 r21.32、若有定义二进制数的文法如下:S→L.L|L L→LB|B B→0|1(1) 试为该文法构造LR分析表,并说明属哪类LR分析表。

(2) 给出输入串101.110的分析过程。

解:1、拓广文法为G′,增加产生式S′→S,若产生式排序为:0 S' →S 1 S →L.L 2 S →L3 L →LB4 L →B5 B →06 B →12、G′的LR(0)项目集族及识别活前缀的DFA3、判定文法在S2、S8中::B →.0和B →.1为移进项目,S →L.(S →L.L )为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。

文法中:Follow(S' ) = {#} Follow(S ) = {#}Follow(L ) = {.,0,1,#} Follow(B ) = {.,0,1,#}在S2、S8中:Follow(s)∩{0}∩{1}= { #}∩{0}∩{1}=所以在I2、I8中的移进-归约冲突可以由Follow集解决,所以G是SLR(1)文法。

编译原理教程课后习题答案——第七章

编译原理教程课后习题答案——第七章

第七章目标代码生成7.1 对下列四元式序列生成目标代码:T=A-BS=C+DW=E-FU=W/TV=U*S其中,V是基本块出口的活跃变量,R0和R1是可用寄存器。

【解答】简单代码生成算法依次对四元式进行翻译。

我们以四元式T=a+b为例来说明其翻译过程。

汇编语言的加法指令代码形式为ADD R, X其中,ADD为加法指令;R为第一操作数,第一操作数必须为寄存器类型;X为第二操作数,它可以是寄存器类型,也可以是内存型的变量。

ADD R,X指令的含意是:将第一操作数R与第二操作数相加后,再将累加结果存放到第一操作数所在的寄存器中。

要完整地翻译出四元式T=a+b,则可能需要下面三条汇编指令:MOV R, aADD R, bMOV T, R第一条指令是将第一操作数a由内存取到寄存器R中;第二条指令完成加法运算;第三条指令将累加后的结果送回内存中的变量T。

是否在翻译成目标代码时都必须生成这三条汇编指令呢?从目标代码生成的优化角度考虑,即为了使生成的目标代码更短以及充分利用寄存器,上面的三条指令中,第一条和第三条指令在某些情况下是不必要的。

这是因为,如果下一个四元式紧接着需要引用操作数T,则第三条指令就不急于生成,可以推迟到以后适当的时机再生成。

此外,如果必须使用第一条指令,即第一操作数不在寄存器而是在内存中,且此时所有可用寄存器都已分配完毕,这时就要根据寄存器中所有变量的待用信息(也即引用点)来决定淘汰哪一个寄存器留给当前的四元式使用。

寄存器的淘汰策略如下:(1) 如果某寄存器中的变量已无后续引用点且该变量是非活跃的,则可直接将该寄存器作为空闲寄存器使用。

(2) 如果所有寄存器中的变量在基本块内仍有引用点且都是活跃的,则将引用点最远的变量所占用寄存器中的值存放到内存与该变量对应的单元中,然后再将此寄存器分配给当前的指令使用。

因此,本题所给四元式序列生成的目标代码如下:MOV R0, ASUB R0, C /*R0=T*/MOV R1, CADD R1, D /*R1=S*/MOV S, R1 /*S引用点较T引用点远,故将R1的值送内存单元S*/MOV R1, ESUB R1, F /*R1=W*/SUB R1, R0 /*R1=U*/MUL R1, S /*R1=V*/7.2 假设可用的寄存器为R0和R1,且所有临时单元都是非活跃的,试将以下四元式基本块:T1=B-CT2=A*T1T3=D+1T4=E-FT5=T3*T4W=T2/T5用简单代码生成算法生成其目标代码。

【习题答案】第07章 语义分析与中间代码生成

【习题答案】第07章 语义分析与中间代码生成

课后练习参考答案第07章语义分析与中间代码生成1.将下列语句翻译为逆波兰表示(后缀式)、三元式和四元表示:a:=(b+c)*e+(b+c)/f【解题思路】把中缀式转换为后缀式的简单方法:按中缀式中各运算符的优先规则,从最先执行的部分开始写,一层层套。

如a≤b+c∧a>d∨a+b≠e,先把b+c写为bc+;然后把a≤套上去,成为abc+≤;再把a>d表示为ad>;然后把∧套上去,成为abc+≤ad>∧,依此类推。

四元式由4个部分组成:算符op、第1和第2运算量arg1和arg2,以及运算结果result。

运算量和运算结果有时指用户自定义的变量,有时指编译程序引进的临时变量。

如果op是一个算术或逻辑算符,则result总是一个新引进的临时变量,用于存放运算结果。

三元式只需3个域:op、arg1和arg2。

与四元式相比,三元式避免了临时变量的填入,而是通过计算这个临时变量的语句的位置来引用这个临时变量。

我们很容易把一个算术表达式或一个赋值句表示为四元式序列或三元式序列。

【解】逆波兰表示为:bc+e*bc+f/+:=三元式序列为:(1)(+,b,c)(2)(* ,(1) ,e)(3)(+ ,b,c)(4)(/ ,(3) ,f)(5)(+ ,(2) ,(4))(6)(:= ,a,(5))四元式序列为:(1)(+ ,b,c,T1)(2)(* ,T1,e,T2)(3)(+ ,b,c,T3)(4)(/ ,T3,f,T4)(5)(+ ,T2,T4,T5)(6)(:= ,T5,-,a)2.将下列C程序的执行语句翻译成三地址代码(设S.next 为L0):if ( i < j )s = 10 * s;elsei = - j;【解】翻译结果如下:if i < j goto L1goto L2L1: t0 = 10 * ss = t0goto L0L2: t1 = - ji = t1L0: ...3.给出下面表达式的逆波兰表示(注:用¥表示if-then-else运算):if (x+y)*z=0 then s:=(a+b)*c else s:=a*b*c【解】逆波兰式为:xy+z*0=sab+c*:=sab*c*:=¥4.写出下列语句的四元式序列:(假设地址从100开始)WHILE A<C AND B<D DOIF A=1 THEN C:=C+1ELSE WHILE A<=D DOA:=A+2;【解】(100) (j<,A,C,102)(101) (j,-,-,114)(102) (j<,B,D,104)(103) (j,-,-,114)(104) (j=,A,1,106)(105) (j,-,-,109)(106) (+,C,1,T) (107) (:=,T,-,C) (108) (j,-,-,100) (109) (j<=,A,D,111) (110) (j,-,-,100) (111) (+,A,2,T)(112) (:=,T,-,A) (113) (j,-,-,109)(114)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(1) 试应用DAG进行优化; (2) 假定只有R、H在基本块出口是活跃的,写出优化后 的四元式序列; (3) 假定只有两个寄存器AX、BX,试写出上述优化后 的四元式序列的目标代码。 【解答】 (1) 根据DAG的构造算法构造基本块P的DAG 步骤如图7-1的(a)到(h)所示。
MOV MUL
R1, A R1, R0 该结果
//取一个空闲寄存器 R1 //运算结束后 R1 中为 T2 结果,内存中无
MOV R0, D
ADD R0, ?1? 该结果
/*此时 R0 中结果 T1 已经没有引用点, 且临时单元 T1 是非活跃的,所以,寄存 器 R0 可作为空闲寄存器使用*/ //运算结束后 R0 中为 T3 结果,内存中无
本块时,所有的寄存器被当成空闲的寄 存器使用,从而造成计算结果的丢失。
考虑到寄存器 R0 中的 T5和寄存器 R1 中 的 W,临时单元 T5 是非活跃的,因此 只要将结果 W 存回对应单元即可*/
7.4 对基本块 P:
S0=2 S1=3/S0 S2=T-C S3=T+C R=S0/S3 H=R S4=3/S1 S5=T+C S6=S4/S5 H=S6*S2
我们以四元式T=a+b为例来说明其翻译过程。 汇编语言的加法指令代码形式为
ADD R, X
其中,ADD为加法指令;R为第一操作数,第一操作数必须 为寄存器类型;X为第二操作数,它可以是寄存器类型,也 可以是内存型的变量。ADD R,X指令的含义是:将第一操 作数R与第二操作数相加后,再将累加结果存放到第一操作 数所在的寄存器中。要完整地翻译出四元式T=a+b,则可能 需要下面三条汇编指令:
MOV T2, R1
MOV R1, E SUB R1, F MUL R0, R1
/*翻译四元式 T4=E-F 时,所有寄存器已 经分配完毕,寄存器 R0 中存的 T3 和寄 存器 R1 中存的 T2 都是有用的。由于 T2 的下一个引用点较 T3 的下一个引用点 更远,所以暂时可将寄存器 R1 中的结果 存回到内存的变量 T2 中,从而将寄存器 R1 空闲以备使用*/
此外,如果必须使用第一条指令,即第一操作数不在 寄存器而是在内存中,且此时所有可用寄存器都已分配完毕, 这时就要根据寄存器中所有变量的待用信息(也即引用点)来 决定淘汰哪一个寄存器留给当前的四元式使用。寄存器的淘 汰策略如下:
(1) 如果某寄存器中的变量已无后续引用点且该变量是 非活跃的,则可直接将该寄存器作为空闲寄存器使用。
(2) 如果所有寄存器中的变量在基本块内仍有引用点且 都是活跃的,则将引用点最远的变量所占用寄存器中的值存 放到内存与该变量对应的单元中,然后再将此寄存器分配给 当前的指令使用。
因此,本题所给四元式序列生成的目标代码如下:
MOV R0, A
SUB R0, C
//R0=Tຫໍສະໝຸດ MOV R1, CADD R1, D
//运算结束后 R1 中为 T4 结果,内存中无 该结果
/*运算结束后 R0 中为 T5 结果,内存中 无该结果。注意,该指令将寄存器 R0 中原来的结果 T3 冲掉了。可以这么做的 原因是,T3 在该指令后不再有引用点, 且是非活跃变量*/
MOV R1, T2 DIV R1, R0 MOV W, R1
/*此时 R1 中结果 T4 已经没有引用点, 且临时单元 T4 是非活跃的,因此寄存器 R1 可作为空闲寄存器使用*/ /*运算结束后 R1 中为 W 结果,内存中 无该结果。此时所有指令部分已经翻译 完毕*/ /*指令翻译完毕时,寄存器中存有最新 的计算结果,必须将它们存回到内存相
应的单元中去,否则,在翻译下一个基
A.具体的机器结构
B.指令格式
C.字长及寄存器个数和种类
D.A~C项
【解答】 (1) 代码生成器最重要的指标是代码的正确性,如果没
有正确性,即使生成的代码再高效、再简洁、再具有可维护 性,都是无用的。故选A。
(2) 编译程序生成的目标代码通常有:可立即执行的机 器语言代码、待装配的机器语言代码模块和汇编语言代码。 故选D。
(3) 设计一个代码生成器需要考虑具体的机器结构、指 令格式、字长及寄存器个数和种类。故选D。
7.2 对下列四元式序列生成目标代码: T=A-B S=C+D W=E-F U=W/T V=U*S
其中,V是基本块出口的活跃变量,R0和R1是可用寄存器。 【解答】 简单代码生成算法依次对四元式进行翻译。
第七章 目标代码生成
7.1 完成下列选择题:
(1) 评价一个代码生成器最重要的指标是 。
A.代码的正确性 B.代码的高效性
C.代码的简洁性 D.代码的维护性
(2) 编译程序生成的目标代码通常有 。
A.可立即执行的机器语言代码 B.汇编语言代码
C.待装配的机器语言代码模块 D.A~C项
(3) 设计一个代码生成器要考虑 。
//R1=S
MOV S, R1
//S 引用点较 T 引用点远,故将 R1
的值送内存单元 S
MOV R1, E SUB R1, F SUB R1, R0 MUL R1, S
//R1=W //R1=U //R1=V
7.3 假设可用的寄存器为 R0 和 R1,且所有临时单元都是 非活跃的,试将以下四元式基本块:
MOV R, a ADD R, b MOV T, R
第一条指令将第一操作数a由内存取到寄存器R中;第 二条指令完成加法运算;第三条指令将累加后的结果送回内 存中的变量T。是否在翻译成目标代码时都必须生成这三条 汇编指令呢?从目标代码生成的优化角度考虑,即为了使生 成的目标代码更短以及充分利用寄存器,上面的三条指令中, 第一条和第三条指令在某些情况下是不必要的。这是因为, 如果下一个四元式紧接着需要引用操作数T,则第三条指令 就不急于生成,可以推迟到以后适当的时机再生成。
T1=B-C T2=A*T1 T3=D+1 T4=E-F
T5=T3*T4
W=T2/T5 用简单代码生成算法生成其目标代码。
【解答】 该基本块的目标代码如下(指令后面为相应的注
释): MOV SUB
R0, B R0, C 该结果
//取第一个空闲寄存器 R0 //运算结束后 R0 中为 T1 结果,内存中无
相关文档
最新文档