《编译原理教程》课后习题答案 第五章 代码优化

合集下载

《编译原理》课后习题答案第5章

《编译原理》课后习题答案第5章

2
《编译原理》课后习题答案第五章
#)NS
a
)#...
#)Na
a
)#...
#)N
)
#...
#)
)
#...
#
#
可见输入串(a,a)#是文法的句子。
S→a .
N→ε
计算机咨询网()陪着您
3
《编译原理》课后习题答案第五章
第3题
已知文法 G[S]: S→MH|a H→LSo|ε K→dML|ε L→eHf M→K|bLM 判断 G 是否是 LL(1)文法,如果是,构造 LL(1)分析表。
A B N
FIRST {b} {b,a} {b,a}
FOLLOW {#} {#,b} {#,b }
预测分析表:
a
b
#
A
→baB
→ε
B
→a
→bN
N
→aBbb
→b
由预测分析表中无多重入口判定文法是 LL(1)的。
(2) 文法: A→aABe|a B→Bb|d
提取左公共因子和消除左递归后文法变为: 0) A→a N 1) N→A B e 2) N→ε
非终结符
FIRST 集
FOLLOW 集
计算机咨询网()陪着您
7
《编译原理》课后习题答案第五章
S
{b}...
B
{a}...
N
{ε,a}
对相同左部的产生式可知:
SELECT(N→B a N)∩SELECT(N→ε) ={ a }∩ {# }= 所以文法是 LL(1)的。 预测分析表(Predicting Analysis Table)
A→BaC|CbB B→CbBcB'|cB' B'→aCcB'|ε C→cB'bC'|bC' C'→bBcB'bC'|ε

编译原理-第5章-习题与答案2上课讲义

编译原理-第5章-习题与答案2上课讲义

编译原理-第5章-习题与答案2第五章习题5-1 设有文法G[S]:S→A/ A→aA∣AS∣/(1) 找出部分符号序偶间的简单优先关系。

(2) 验证G[S]不是简单优先文法。

5-2 对于算符文法G[S]:S→E E→E-T∣T T→T*F∣F F→-P∣P P→(E)∣i(1) 找出部分终结符号序偶间的算符优先关系。

(2) 验证G[S]不是算符优先文法。

5-3 设有文法G′[E]:E→E1 E1→E1+T1|T1 T1→T T→T*F|F F→(E)|i其相应的简单优先矩阵如题图5-3所示,试给出对符号串(i+i)进行简单优先分析的过程。

题图5-3 文法G′[E]的简单优先矩阵5-4 设有文法G[E]:E→E+T|TT→T*F|FF→(E)|i其相应的算符优先矩阵如题图5-4所示。

试给出对符号串(i+i)进行算符优先分析的过程。

题图5-4 文法G[E]的算符优先矩阵5-5 对于下列的文法,试分别构造识别其全部可归前缀的DFA和LR(0)分析表,并判断哪些是LR(0)文法。

(1) S→aSb∣aSc∣ab(2) S→aSSb∣aSSS∣c(3) S→A A→Ab∣a5-6 下列文法是否是SLR(1)文法?若是,构造相应的SLR(1)分析表,若不是,则阐明其理由。

(1) S→Sab∣bR R→S∣a(2) S→aSAB∣BA A→aA∣B B→b(3) S→aA∣bB A→cAd∣ε B→cBdd∣ε5-7 对如下的文法分别构造LR(0)及SLR(1)分析表,并比较两者的异同。

S→cAd∣b A→ASc∣a5-8 对于文法G[S]:S→A A→BA∣ε B→aB∣b(1) 构造LR(1)分析表;(2) 给出用LR(1)分析表对输入符号串abab的分析过程。

5-9 对于如下的文法,构造LR(1)项目集族,并判断它们是否为LR(1)文法。

(1) S→A A→AB∣ε B→aB∣b(2) S→aSa∣a第5章习题答案25-1 解:(1) 由文法的产生式和如答案图5-1(a)所示的句型A//a/的语法树,可得G中的部分优先关系如答案图5-1(b)所示。

编译原理课后习题答案-清华大学-第二版

编译原理课后习题答案-清华大学-第二版

《编译原理》课后习题答案第一章
是哪种方式,其加工结果都是源程序的执行结果。目前很多解释程序采取上述两种方式的综 合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。
广义上讲,编译程序和解释程序都属于翻译程序,但它们的翻译方式不同,解释程序是 边翻译(解释)边执行,不产生目标代码,输出源程序的运行结果。而编译程序只负责把源 程序翻译成目标程序,输出与源程序等价的目标程序,而目标程序的执行任务由操作系统来 完成,即只翻译不执行。
好似滚雪球一样,直到我们所要求的编译程序。 (4)移植:将 A 机器上的某高级语言的编译程序搬到 B 机器上运行。
《编译原理》课后习题答案第一章
第6题
计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?
答案: 计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。 像 Basic 之类的语言,属于解释型的高级语言。它们的特点是计算机并不事先对高级语
第4题
对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、 代码生成)报告的。 (1) else 没有匹配的 if (2) 数组下标越界 (3) 使用的函数没有定义 (4) 在数中出现非数字字符
答案: (1) 语法分析 (2) 语义分析 (3) 语法分析 (4) 词法分析
第5题
b∶=10; end (q); procedure s; var c,d; procedure r;
var e,f; begin (r)
call q; end (r); begin (s) call r; end (s); begin (p) call s;
end (p); begin (main)

编译原理课后习题答案

编译原理课后习题答案

编译原理课后习题答案第一章1.典型的编译程序在逻辑功能上由哪几部分组成?答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。

2. 实现编译程序的主要方法有哪些?答:主要有:转换法、移植法、自展法、自动生成法。

3. 将用户使用高级语言编写的程序翻译为可直接执行的机器语言程序有哪几种主要的方式?答:编译法、解释法。

4. 编译方式和解释方式的根本区别是什么?答:编译方式:是将源程序经编译得到可执行文件后,就可脱离源程序和编译程序单独执行,所以编译方式的效率高,执行速度快;解释方式:在执行时,必须源程序和解释程序同时参与才能运行,其不产生可执行程序文件,效率低,执行速度慢。

第二章1.乔姆斯基文法体系中将文法分为哪几类?文法的分类同程序设计语言的设计与实现关系如何?答:1)0型文法、1型文法、2型文法、3型文法。

2)2. 写一个文法,使其语言是偶整数的集合,每个偶整数不以0为前导。

答:Z→SME | BS→1|2|3|4|5|6|7|8|9M→ε | D | MDD→0|SB→2|4|6|8E→0|B3. 设文法G为:N→ D|NDD→ 0|1|2|3|4|5|6|7|8|9请给出句子123、301和75431的最右推导和最左推导。

答:N?ND?N3?ND3?N23?D23?123N?ND?NDD?DDD?1DD?12D?123N?ND?N1?ND1?N01?D01?301N?ND?NDD?DDD?3DD?30D?301N?ND?N1?ND1?N31?ND31?N431?ND431?N5431?D5431?7 5431N?ND?NDD?NDDD?NDDDD?DDDDD?7DDDD?75DDD?754 DD?7543D?75431 4. 证明文法S→iSeS|iS| i是二义性文法。

答:对于句型iiSeS存在两个不同的最左推导:S?iSeS?iiSesS?iS?iiSeS所以该文法是二义性文法。

编译原理 第5章习题解答

编译原理 第5章习题解答

第五章习题解答5.1 设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。

S→SASCS→εA→AaA→bC→DcDD→d5.2 消除下列文法的左递归:① G[A]:A→BX∣CZ∣WB→Ab∣BcC→Ax∣By∣Cp② G[E]:E→ET+∣ET–∣TT→TF*∣TF/FF→(E)∣i③ G[X]:X→Ya∣Zb∣cY→ Zd∣Xe∣fZ→X e∣Yf∣a④ G[A]:A→Ba|Aa|cB→Bb|Ab|d5.3 设文法G[<语句>]:<语句>→<变量>: = <表达式>|if<表达式>then<语句>|if<表达式>then<语句>else<语句> <变量>→i<表达式>→<项>|<表达式>+<项><项>→<因子>|<项>*<因子><因子>→<变量>|′(′<表达式>′)′试构造该文法的递归下降子程序。

5.4 设文法G[E]:E→ TE'E'→ + E∣εT→ FT'T'→ T∣εF→ PF'F'→ *F∣εP→ (E)∣ a∣^①构造该文法的递归下降分析程序;②求该文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造该文法的LL(1)分析表,并判断此文法是否为LL(1)文法。

5.5 设文法G[S]:S→ SbA∣aAB→ SbA→ Bc①将此文法改写为LL(1)文法;②求文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造相应的LL(1)分析表。

5.6 设文法G[S]:S→ aABbcd∣εA→ ASd∣εB→ SAh∣eC∣εC→ Sf∣Cg∣εD→ aBD∣ε①求每一个非终结符的FOLLOW集合;②对每一个非终结符的产生式选择,构造FIRST集合;③该文法是LL(1)文法。

编译原理教程05代码优化

编译原理教程05代码优化
缺点
可能会增加代码大小,增加编译时间 和内存占用。
优点
减少函数调用的开销,提高代码执行 效率。
使用场景
对于小函数且被频繁调用的情况,使 用内联优化可以获得更好的性能。
死代码删除
定义
死代码删除是指删除程序中永远不会被执行到的代码,以提高代码的执行效率。
优点
减少代码大小,提高程序执行效率。
缺点
可能导致程序行为发生变化,需要谨慎使用。
使用场景
在编译过程中进行静态分析,识别并删除无用的代码。
循环展开
定义
优点
循环展开是一种优化技术, 通过将循环体中的代码复制 到循环外部,减少循环次数, 提高代码执行效率。
减少循环次数,提高代码执 行效率。
Байду номын сангаас缺点
可能会增加代码大小,增加 编译时间和内存占用。
使用场景
对于循环次数较少且循环体 内有大量计算的场景,使用 循环展开可以获得更好的性 能。
编译器可以识别并替换常量表达式的结果, 以减少计算需求。
死代码消除
移除永远不会被执行到的代码,减少生成的 代码大小。
寄存器分配
优化寄存器的使用,提高指令的执行效率。
全局优化
循环展开
通过重复执行循环体来减少循环次数,提高执 行效率。
循环不变量代码外提
将循环不变量代码移出循环,减少循环内的计 算负担。
可以分为速度优化和空间优化。速度优化以提高执行速度为目标,而空
间优化则以减小目标代码的体积为目标。
03
按照优化手段分类
可以分为基于规则的优化和基于程序的优化。基于规则的优化是指根据
一些固定的规则对代码进行优化,而基于程序的优化则是指根据程序的

编译原理 第5章 代码优化

编译原理  第5章  代码优化
DAG(Directed Acyclic Graph)是一种有向图,常 常用来对基本块进行优化。一个基本块的DAG是一种 其结点带有下述标记或附加信息的DAG: (1) 图的叶结点(无后继的结点)以一标识符(变量名)
或常数作为标记,表示该结点代表该变量或常数的值。
如果叶结点用来表示一变量A的地址,则用addr(A)作 为该结点的标记。通常把叶结点上作为标记的标识符
然后再把A附加到新结点n上,并令Node(A)=n。
第5章 代码优化
例5.3 构造以下基本块的DAG。
(1) T0=3.14 (2) T1=2* T0
(3) T2=R+r
(4) A= T1* T2 (5) B=A (6) T3=2* T0 (7) T4=R+r (8) T5=T3* T4 (9) T6=R-r
n1
(S)
(5) if B rop C goto (S)
(7) goto (S)
图5–1 四元式与DAG结点
第5章 代码优化
利用DAG进行基本块优化的基本思想是:
首先按基本块内的四元式序列顺序将所有
的四元式构造成一个DAG,然后按构造结点的
次序将DAG还原成四元式序列。由于在构造
DAG的同时已作了局部优化,所以最后所得到
n5 +
T2 n4
*
n1 T0
2
r
(b) T1=2*T0
(c) T2=R+r n6 A,B
n6 A *
n5
+
T2 n4 r
*
n5 +
T2
n1 3.14
T0 n2 6.28
T1 n3 R (d) A=T1*T2
n1

编译原理-第五章习题答案

编译原理-第五章习题答案

上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤 (1) (2) (3) (4) (5) (6)

# #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
输入 abbcde# bbcde# bcde# bcde# cde# cde#
上一页
下一页
20
5)构造算符优先文法G的优先表的算法
思路:对文法中的每一个产生式的候选式检查,判断句型中相邻符号之间 的关系 来构造优先表; 具体算法: FOR 每条产生式P→X1X2…Xn FOR i=1 TO n-1 IF Xi,Xi+1∈VT,THEN Xi=Xi+1; IF i ≤n-2且Xi,Xi+2∈VT,Xi+1∈VN THEN Xi=Xi+2; IF Xi∈VT,Xi+1∈VN THEN FOR FIRSTVT(Xi+1)中的每个a Xi <. a; NEXT IF Xi∈VN,Xi+1∈VT THEN FOR LASTVT(Xi)中的每个a DO a .> Xi+1; NEXT NEXT NEXT

上一页
下一页
8
例:5.1 P85 文法: E→T|E+T T→F|T*F F→i|(E) 句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上 E 句型:E+T*F+i 短语:E+T*F+i,E+T*F,T*F,i 直接短语:T*F和i E + 句柄:T*F

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

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

第五章代码优化5.1 完成以下选择题:(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. 满足对称性【解答】(1) d (2) c (3) b (4) d (5) d5.2 何谓局部优化、循环优化和全局优化?优化工作在编译的哪个阶段进行?【解答】优化根据涉及的程序范围可分为三种。

(1) 局部优化是指局限于基本块范围内的一种优化。

一个基本块是指程序中一组顺序执行的语句序列(或四元式序列),其中只有一个入口(第一个语句)和一个出口(最后一个语句)。

对于一个给定的程序,我们可以把它划分为一系列的基本块,然后在各个基本块范围内分别进行优化。

通常应用DAG方法进行局部优化。

(2) 循环优化是指对循环中的代码进行优化。

例如,如果在循环语句中某些运算结果不随循环的重复执行而改变,那么该运算可以提到循环外,其运算结果仍保持不变,但程序运行的效率却提高了。

循环优化包括代码外提、强度削弱、删除归纳变量、循环合并和循环展开。

5.3 将下面程序划分为基本块并作出其程序流图。

read(A,B)F=1C=A*AD=B*Bif C<D goto L1E=A*AF=F+1E=E+Fwrite(E)haltL1: E=B*BF=F+2E=E+Fwrite(E)if E >100 goto L2haltL2: F=F-1goto L1【解答】先求出四元式程序中各基本块的入口语句,即程序的第一个语句,或者能由条件语句或无条件转移语句转移到的语句,或者条件转移语句的后继语句。

《编译原理》习题参考答案(六)

《编译原理》习题参考答案(六)

《编译原理》习题参考答案(六)第五章5.4 为下列类型写类型表达式:(a) 指向实数的指针数组,数组的下标从1到100。

(b) 两位数组(即数组的数组),他的行下标从1到10,列下标从1到20。

(c) 函数,他的定义域是从整数到整数的指针的函数,它的值域是从一个整数和一个字符组成的纪录。

Solution:(a) array ( 1 . . 100 , pointer ( real ) )(b) array ( 1 . . 10 , array ( 1 . . 20 , type ) )(c) ( integer →pointer(integer) )→record((i : integer) * ( c : char )) 假定作为值域的记录类型的两个域分别叫i和c。

5.6 下列文法定以字面常量表的表。

符号的解释和图5.2文法的那些相同,增加了类型list,它表示类型T的元素表。

→ D ; EP→ D ; D | id : TD→ list of T | char | integerTE→ ( L ) | literal | num | id→ E , L | EL写一个类似5.3节中的翻译方案,以确定表达式( E )和表( L )的类型。

P→ D ; ED→ D ; DD→ id : T { addtype ( id.entry , T.type ) }T→ char { T.type := char }T→ integer { T.type := integer }T→ list of T1 { T.type := list ( T1.type ) }E→ literal { E.type := char }E→ num { E.type := integer }E→ id { E.type := lookup ( id.entry ) }E→ ( L ) { E.type := list ( L.type ) }L→E{L.type:=E.type}L→ E , L1 { L.type := if L1.type = E.type then E.typeelse type_error }5.16 对下面的每对表达式,找出最一般的合一代换:(a) α1 → ( α2 →α1 )(b) array ( β1 ) → ( pointer( β1 ) →β2 )(c) γ1 →γ2(d) δ1 →(δ1 →δ2 )Solution:S(α1) = array ( β1 ) S(α2) = pointer ( β1 ) S(β2) = array ( β1 ) (a)(c):S(γ1) = α1 S(γ2) = α2 → α1 (a)(d):S(α1) = S(α2) = S(δ1) = S(δ2) = α (b)(c):S(γ1) = array ( β1 ) S(γ2) = pointer ( β1 ) → β2 (b)(d): 无 (c)(d):S(γ1) = δ1 S(γ2) = δ1 → δ25.17 仿效例5.5,推到下面map 的多态类型: map: ∀ α . ∀ β . ( ( α → β ) * list ( α ) ) → list ( β ) map 的ML 定义是 fun map ( f , l ) = if null ( l ) then nilelse cons ( f ( hd ( l ) ) , map ( f , tl ( l ) ) );在这个函数体中,内部定义的标识符的类型是: null : ∀α . list (α ) → boolean ; nil : ∀α . list (α ) ;cons : ∀α . ( α * list (α ) ) → list (α ) ;hd:∀α . list (α ) →α;∀α . list (α ) → list (α ) ;tl:Solution:行定型断言代换规则(1) f : α( Exp Id )(2) l : β( Exp Id )(3) map : γ( Exp Id )(4) map ( f , l ) : δγ = ( α * β ) →δ(Exp Funcall)(5) null : list (α0) → boolean ( Exp Id ) 和( Type Fresh )(6) null ( l ) : boolean β = list (α0) (Exp Funcall)(7) nil : list (α1) ( Exp Id ) 和( Type Fresh )(8) l : list (α0) 由(2)可得(9) hd : list (α2) →α2( Exp Id ) 和( Type Fresh )(10) hd ( l ) : α0α2 = α0(Exp Funcall)(11) f ( hd ( l ) ) : α3α = α0→α3( Exp Id )(12) f : α0→α3由(1)可得(13) tl : list (α4)→ list (α4) ( Exp Id ) 和( Type Fresh )(14) tl ( l ) : list (α0) α4 = α0(Exp Funcall)(15) map : ((α0→α3)*list(α0))→δ由(3)可得(16) map ( f , tl ( l ) ) : δ(Exp Funcall)(17) cons : α5 * list(α5) → list(α5) ( Exp Id ) 和( Type Fresh ) (18) cons (…) : list (α3) α5 = α3 , δ=list(α3) (Exp Funcall)(19) if : boolean *α6 * α6→α6( Exp Id ) 和( Type Fresh )(20) if (…) : list (α1) α6 = α1 , α3 = α1(Exp Funcall)(21) match : α7 *α7 →α7( Exp Id ) 和( Type Fresh ) (22) match (…) : list (α1) α7 = list (α1) (Exp Funcall)至此有map : ( (α0→α1)*list(α0) )→list(α1)所以map : ∀α . ∀β . ( ( α→β ) * list ( α ) ) → list ( β )5.18 假定类型名link和cell如5.5节那样定义,下面的表达式中,那些结构等价?那些名字等价?(a) link(b) pointer ( cell )(c) pointer ( link )(d) pointer ( record ( ( info : integer ) * ( next : pointer ( cell ) ) ) ) Solution:(a)、(b)、(d)结构等价,无名字等价。

编译原理答案第五章

编译原理答案第五章

练习5.1解答:输入(4*7+1)*2n,带注释的分析树如下:练习5.2解答: (1)根据表5.3中的语法制导定义建立表达式((a)+(b))的分析树和语法树(2)根据图5.17的翻译模式构造((a)+(b))的分析树和语法树练习5.3解答:设置下面的函数和属性:expr1||expr2:把表达式expr2拼写在表达式expr1后面。

deletep(expr):去掉表达式expr左端的‘(’和右端的‘)’。

E.expr,T.expr,F.expr:属性变量,分别表示E,T,F的表达式。

E.add,T.add,F.add,属性变量,若为true,则表示其表达式中外层有‘+’号,否则无‘+’号。

E.pmark,T.pmark,F.pmark,属性变量,若为true,表示E,T,F的表达式中左端为‘(’,右端是‘)’。

语法制导定义如下:产生式语义规则E -> E1 +T if(T.pmark==true)THEN E.expr=E1.expr||'+'||deletep(T.expr) ELSE E.expr:=E1.expr||'+'||T.expr;E.add:=true;E.pmark:=false;E -> T if(T.pmark==true)THEN E.expr:=deletep(T.expr)ELSE E.expr:=T.expr;E.add:=T.add;E.pmark:=false;T -> T1*F T.expr:=T1.expr||'*'||F.expr; T.add:=false;T.pmark:=false;T -> F T.expr:=F.expr; T.add:=F.add;T.pmark:=F.pmark;F -> (E) if(E.add==false)THEN BEGINF.expr:=E.expr;F.add:=false;F.pmark:=false;ENDELSE BEGINF.expr:='('||E.expr||')';F.add:=true;F.pmark:=true;END;F -> id F.expr:=id.lexval;F.add:=false;F.pmark:=false;练习5.4解答: (1)语法制导定义如下:产生式语义规则E -> E1+T if(E1.type==int) AND (T.type==int) THEN E.type:=intELSE E.type:=real;E -> T E.type:=T.type;T -> num T.type:=int;T -> num.num T.type:=real;(2)设E.pf和T.pf分别是E和T的前缀形式,||是两个字符串的连接,语法制导定义如下:产生式语义规则E -> E1+T if(E1.type==int) AND (T.type==int)THEN E.type:=intELSE BEGINE.type:=real;if(E1.type==int) AND (T.type==real)THEN E1.pf:='inttoreal'||E1.pfELSE if(E1.type==real)AND(T.type==int)THEN T.pf:='inttoreal'||T.pfEND;E.pf:='+'||E1.pf||T.pf;E -> T E.type:=T.type; E.pf:=T.pf;T -> num T.type:=int; T.pf:=int.lexval;T ->num.numT.type:=real; T.pf:=real.lexval;练习5.5解答: (1)用综合属性决定s.val的语法制导定义:产生式语义规则S -> L S.val:=L.val;S ->L1.L2S.val:=L1.val+L2.val*L2.p;L -> B L.val:=B.val; L.p:=2-1;L -> L1B L.val:=L1.val*2+B.val; L.p:=L.p*2-1;B -> 0 B.val:=0;B -> 1 B.val:=1;注:L.p表示恢复L.val的因子。

编译原理-第1~5章习题课答案

编译原理-第1~5章习题课答案

选择题2答案
编译原理的主要目的是将高级语言编写的 程序转换成低级语言编写的程序,以提高 程序的运行效率和可移植性。
编译过程主要包括词法分析、语法分析、 语义分析、中间代码生成、代码优化和目 标代码生成等阶段。
选择题3答案
选择题4答案
词法分析是将源程序分解成一个个的单词 或符号,供语法分析器识别和匹配。
编译原理-第1~5章习题课答案
目录
CONTENTS
• 第一章习题答案 • 第二章习题答案 • 第三章习题答案 • 第四章习题答案 • 第五章习题答案
01 第一章习题答案
CHAPTER
填空题答案
填空题1答案
编译原理是将高级语言编写的程 序转换成低级语言编写的程序的
过程。
填空题2答案
编译过程主要包括词法分析、语法 分析、语义分析、中间代码生成、 代码优化和目标代码生成等阶段。
• 简答题3答案:编译器的输入是源程序,输出是目标程序。源程序是用高级语言编写的程序,目标程序是用低级语言编 写的程序。
02 第二章习题答案
CHAPTER
填空题答案
填空题1答案
编译原理是将高级语言编写的程序转 换成低级语言编写的程序的过程。
02
填空题2答案
编译过程主要包括词法分析、语法分 析、语义分析、中间代码生成、代码 优化和目标代码生成等阶段。
是编译过程的基础。
简答题3答案
编译原理中的语义分析阶段主要 包括类型检查、语义检查和符号 表管理等任务,以确保源程序的
语义正确性。
04 第四章习题答案
CHAPTER
填空题答案
填空题1答案
01
编译原理是将高级语言编写的程序转换成低级语言编写的程序

(完整版)编译原理第五章作业参考答案

(完整版)编译原理第五章作业参考答案

SELECT(F PF/ )=FIRST(P)={(,a,b,^};
SELECT(F/ *F /)={*}; SELECT(F/ ε )=FOLLOW(F/)={(,a,b,^,+,),#};
SELECT(P (E))={(}
SELECT(P a)={a}
SELECT(P b)={b}
SELECT(P ^)={^} 可见,相同左部产生式的
if(CH== ’ aR’E)AD(CH);// 产生式 S a else if(CH== ’ ^ ’ ) READ(C产H)生;//式 S ^ else if(CH== ’产( ’生)式// S (T) {
READ(CH); P_T(); IF (CH= =’ ) ’TH)EN READ(CH) else ERROR } else ERR; } void P_T()// 非终结符 S 的子程序 { if(IsIn(CH,FIRST_SU)) //FIRST_SU 为 T SU 的右部的 FIRST 集合 { P_S(); P_U(); } } void P_U()// 非终结符 U 的子程序 { if(CH== ’ , ’产生)//式 U , SU
3.已知文法 G[S] :
S MH|a
H LSo| ε K dML|ε
L eHf
M K|bLM 判断 G是否是 LL( 1)文法,如果是,构造 LL( 1)分析表。 解: 首先求各非终结符的 FIRST 集合:
FIRST 集合有:
FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^}; FIRST(E / )={+, ε }
FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^}; FIRST(T / )=FIRST(T) ∪ { ε }={(,a,b,^, ε };

编译原理课后习题答案+清华大学出版社第二版

编译原理课后习题答案+清华大学出版社第二版

b∶=10; end (q); procedure s; var c,d; procedure r;
e,f;
begin (r)
call q;
end (r); begin (s)
call r; end (s);
begin (p) call s;
end (p);
begin (main)
call p; end
返回地址 RA 的用途。
答案: 栈顶指针 T,最新活动记录基地址指针 B,动态链指针 DL,静态链指针 SL 与返回地址
RA 的用途说明如下: T: 栈顶寄存器 T 指出了当前栈中最新分配的单元(T 也是数组 S 的下标)。 B:基址寄存器,指向每个过程被调用时,在数据区 S 中给它分配的数据段起 始 地址,
总而言之,是边翻译边执行。 像 C,Pascal 之类的语言,属于编译型的高级语言。它们的特点是计算机事先对高级语 言进行全盘翻译,将其全部变为机器代码,再统一执行,即先翻译,后执行。从速度上看, 编译型的高级语言比解释型的高级语言更快。
盛威网()专业的计算机学习网站
4
《编译原理》课后习题答案第二章
第 2题
一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序 的总体结构图。
答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语
义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和 错误处理程序。其各部分的主要功能简述如下。
盛威网()专业的计算机学习网站
2
《编译原理》课后习题答案第一章
合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。

(完整版)编译原理第五章作业参考答案

(完整版)编译原理第五章作业参考答案

第五章自顶向下语法分析方法1.对文法G[S]S→a|∧|(T)T→T,S|S(1)给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。

(2)对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。

(3)经改写后的文法是否是LL(1)的?给出它的预测分析表。

(4)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。

解:(1) (a,(a,a))的最左推导为S→(T)→(T,S)→(S,S)→(a,(T))→(a,(T,S))→(a,(S,a))→(a,(a,a))(((a,a),∧,(a)),a)的最左推导为S→(T)→(T,S)→(S,a)→((T),a)→((T,S),a)→((T,S,S),a)→((S,∧,(T)),a)→(((T),∧,(S)),a) →(((T,S),∧,(a)),a)→(((S,a),∧,(a)),a)→(((a,a),∧,(a)),a)(2)由于有T→T,S的产生式,所以消除该产生式的左递归,增中一个非终结符U有新的文法G/[S]:S→a|∧|(T)T→SUU→,SU|ε分析子程序的构造方法对满足条件的文法按如下方法构造相应的语法分析子程序。

(1) 对于每个非终结号U,编写一个相应的子程序P(U);(2) 对于规则U::=x1|x2|..|xn,有一个关于U的子程序P(U),P(U)按如下方法构造:IF CH IN FIRST(x1) THEN P(x1)ELSE IF CH IN FIRST(x2) THEN P(x2)ELSE ......IF CH IN FIRST(xn) THEN P(xn)ELSE ERROR其中,CH存放当前的输入符号,是一个全程变量;ERROR是一段处理出错信息的程序;P(xj)为相应的子程序。

(3) 对于符号串x=y1y2...yn;p(x)的含义为:BEGINP(y1);P(y2);...P(yn);END如果yi是非终结符,则P(yi)代表调用处理yi的子程序;如果yi是终结符,则P(yi)为形如下述语句的一段子程序IF CH=yi THEN READ(CH) ELSE ERROR即如果当前文法中的符号与输入符号匹配,则继续读入下一个待输入符号到CH中,否则表明出错。

编译原理课后习题答案-清华大学-第二版

编译原理课后习题答案-清华大学-第二版

《编译原理》课后习题答案第二章
第 2 章 PL/0 编译程序的实现
第1题
PL/0 语言允许过程嵌套定义和递归调用,试问它的编译程序如何解决运行时的存储管 理。
答案: PL/0 语言允许过程嵌套定义和递归调用,它的编译程序在运行时采用了栈式动态存储
管理。(数组 CODE 存放的只读目标程序,它在运行时不改变。)运行时的数据区 S 是由 解释程序定义的一维整型数组,解释执行时对数据空间 S 的管理遵循后进先出规则,当每 个过程(包括主程序)被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放。 应用动态链和静态链的方式分别解决递归调用和非局部变量的引用问题。
(2) 扩充 repeat 语句的语法图为:
EBNF 的语法描述为: 〈 重复语句〉::= repeat〈语句〉{;〈语句〉}until〈条件〉
《编译原理》课后习题答案第三章
第 3 章 文法和语言
第1题
文法 G=({A,B,S},{a,b,c},P,S)其中 P 为: S→Ac|aB A→ab B→bc 写出 L(G[S])的全部元素。
注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚, 就回答八部分。 第3题
何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系? 答案:
翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程 序和汇编程序等。
编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编 写的目标程序的翻译程序。
地址,用以过程执行结束后返回调用过程时的下一条指令继续执行。 在每个过程被调用时在栈顶分配 3 个联系单元,用以存放 SL,DL, RA。
第5题
PL/0 编译程序所产生的目标代码是一种假想栈式计算机的汇编语言,请说明该汇编语 言中下列指令各自的功能和所完成的操作。 (1) INT 0 A (2) OPR 0 0 (3) CAL L A

清华大学编译原理第二版课后习答案

清华大学编译原理第二版课后习答案

Lw.《编译原理》课后习题答案第一章第 1 章引论第 1 题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。

(2)源程序:源语言编写的程序称为源程序。

(3)目标程序:目标语言书写的程序称为目标程序。

(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。

通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。

(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。

(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第 2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。

答案:一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。

其各部分的主要功能简述如下。

词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。

语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。

中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。

盛威网()专业的计算机学习网站1《编译原理》课后习题答案第一章目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

编译原理分知识点习题 代码优化

编译原理分知识点习题 代码优化

1.与机器有关的代码优化有那些种类,请分别举例说明。

解答:与机器有关的优化有:寄存器优化,多处理优化,特殊的指令优化,无用的指令消除等四类。

冗余指令删除假设源程序指令序列a:=b+c; c:=a-d;编译程序为其生成的代码很可能是下列指令序列:MOV b, R0ADD c, R0MOV R0,aSUB d, R0MOV R0,c假如第四条指令没有标号,上述两个赋值语句在一个基本块内,则第四条指令是多余的,可删除。

特殊指令的使用例如,如果目标机器指令系统包含增1指令INC,对于i:=i+1的目标代码MOV i, R0ADD #1, R0MOV R0, i便可被代之以1条指令Inc i说明:优化的特点是每个改进可能会引发新的改进机会,为了得到最好的改进,一般可能需要对目标代码重复扫描进行优化。

2.设有语句序列a:=20b:=a*(a+10);c:=a*b;试写出合并常量后的三元式序列。

解答:该语句序列对应的三元式序列为:(1)(:=, 20,a)(2)(+, a, 10)(3)(*, a, (2) )(4)(:=, a, b)(5)(* a, b)(6)(:=, (5), c)合并常量后的三元式序列为:(1)(:=, 20,a)(2)(:=, 600, b)(3)(:=, 12000, c)3、试写出算术表达式a+b*c-(c*b+a-e)/(b*c+d)优化后的四元式序列。

解答:该表达式的四元式序列为:(1)(*,b,c,T1)(2)(+,a,T1,T2)(3)(*,c,b,T3)(4)(+,T3,a,T4)(5)(-,T4,e,T5)(6)(*,b,c,T6)(7)(+,T6,d,T7)(8)(/,T5,T7,T8)(9)(-,T2,T8,T9)可对该表达式进行删除公共子表达式的优化。

优化后的四元式序列为:(1)(*,b,c,T1)(2)(+,a,T1,T2)(3)(-,T2,e,T5)(4)(+,T1,d,T7)(5)(/,T5,T7,T8)(6)(-,T2,T8,T9)4.设有算术表示式(a*b+c)/(a*b-c)+(c*b+a-d)/(a*b+c)试给出其优化后的三元式序列。

编译原理_第1~5章习题课答案

编译原理_第1~5章习题课答案

1
1
1
A 1
第二十五页
补充:构造一右线性文法,使它与如下文法等价:
S→AB A→UT U→a|aU T→b|bT B→c|cB 并根据所得右线性文法,构造出相应的状态转换图。
思路:
先写出原文法所描述的语言 L(G)={ambnck|m,n,k≥1}
G[S]: S →aS|aB
B →bB|bC C →cC|c
2 0φ
④.最小化
Π0=({0,1},{2})
{0,1}a={1}
{0,1}b={2}
因此,不能再分
第二十页
(b)
b
b
0
2
3a
a
a
a a
b b
1
b
4
b5
a
这道题实质上已经是确定化了的,所以我们只需最小化
Π:{2,3,a4,5} {0b,1}
b
{2,3,4,50}a={0,1,3,25} b 分属两区,所以分为{a2,4} {3,5}
I
I0
1
Φ
2
3
4
5
5
Φ
6
3
7
8
8
9
9
11
10
13
11
11
12
14
13
Φ
14
15
15
Φ
16
17
17
15
第十六页
④.DFA
I1
2 4 6 7 4 4 10 12 10 4 6 7 7 16 Φ 6
8、给出下面正规表达式
(1)以01结尾的二进制数串。 (0 | 1)*01
(2)能被5整除的十进制数。 0 | 5 | (1|2|3|4|5|6|7|8|9) (0|1|2|3|4|5|6|7|8|9)*(0 |5)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第五章 代码优化 5.6 出: (1) 各结点的必经结点集合D(n); (2) 流图中的回边与循环。 J=0 L1:I=0 if I< 8 goto L3 试画出如下中间代码序列的程序流图,并求
L2:A=B+C
B=D*C
第五章 代码优化 L3:if B =0 goto L4 write B
提到前置结点B2′中,同时在B3中I=I+1之后给C增加一
个常量1。进行强度削弱后的结果如图5-7所示。
第五章 代码优化
A=0 I=1 B=J+1 C=B+I
B1
′ B2
B2 L :A=C+A 1 if I=100 goto2L F I=I+1 C=C+1 goto L 1 B3 T L :write A B4 2 halt
运算,所以只能进行加法运算的强度削弱。从图5-5中
可以看到,B2中的C=B+I,变量B因代码外提其定值点已 在循环之外,故相当于常数。而另一加数I值由B3 中的
I=I+1决定,即每循环一次I值增1;也即每循环一次,
B2中的C=B+I其C值增量与B3中的I相同,即常数1。因此, 我们可以对C进行强度削弱,即将B2中的四元式C=B+I外
第五章 代码优化 5.8 对下面四元式代码序列: A=0
I=1
L1: B=J+1 C=B+I
A=C+A
if I=100 goto L2 I=I+1 goto L1 L2: write A
halt
第五章 代码优化 (1) 画出其控制流程图; (2) 求出循环并进行循环的代码外提和强度削弱 优化。 【解答】 (1) 在构造程序的基本块的基础上画出 该程序的流图,如图5-5所示。
b=a-d0
d=b c=d+c0
第五章 代码优化 5.5 对于基本块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
第五章 代码优化 (1) 应用DAG对该基本块进行优化; (2) 假定只有R、H在基本块出口是活跃的,试写
环可通过回边求得,即找出由结点B2、结点B3以及有通
路到达B3但不经过B2的所有结点。所以,由回边组成的 B3→B2循环是{ B2,B3}。
进行代码外提就是将循环中的不变运算外提到循
环入口结点前新设置的循环前置结点中。经检查,找 出的不变运算为B2中的B=J+1。因此,代码外提后的程 序流图如图5-6所示。
出优化后的四元式序列。
【解答】 列为 S0=2 S4=2 (1) 根据DAG图得到优化后的四元式序
S1=1.5
S2=T-C
第五章 代码优化 S3=T+C S5=S3 R=2/S3 S6=R H=S6*S2
(2) 若只有R、H在基本块出口是活跃的,优化后的四 元式序列为
S2=T-C S3=T+C R=2/S3 H=R*S2
第五章 代码优化
第五章 代码优化
5.1 完成以下选择题: (1) 优化可生成 a. 运行时间较短 的目标代码。
b. 占用存储空间较小
c. 运行时间短但占用内存空间大 d. 运行时间短且占用存储空间小
第五章 代码优化 (2) 下列 a. 强度削弱 优化方法不是针对循环优化进行的。 b. 删除归纳变量
(2) b在该基本块出口处活跃;
请分别给出下列代码经过优化之后的代码: (1) a=b+c (3) c=b+c (2) b=a-d (4) d=a-d
第五章 代码优化
n5 c + n4 - n2 a + n0 b0 n1 c0 n3 d0 b, d
图5-2 习题5.4的DAG图
第五章 代码优化 【解答】 后的代码为 a=b0+c0 d=a-d0 c=d+c0 (2) 当b在出口活跃时,生成优化后的代码为 a=b0+c0 (1) 当b在出口处不活跃时,生成优化


ni1
ni2 …

nij n
图5-4 具有回边n→d的流图
第五章 代码优化 证明过程如下: (1) 令结点d、结点n以及有通路到达n而该通路不经过d 的所有结点构成集合L(即图5-4中的全部结点),则L必定是 强连通的。为了证明这一点,令M=L-{d,n}。由L的组成成分 可知 M 中 每 一结点 ni 都可以不 经过 d 而到 达 n。又因 d DOM
(2) 基本块i的出口语句是goto(s)或if…goto(s),并
且(s)是基本块j的入口语句。 应用上述方法求出本题所给程序的基本块及程序 流图见图5-1,图中的有向边、实线是按流图画法(1)画 出的,虚线是按流图画法(2)画出的。
第五章 代码优化
read(A,B) F=1 C=A*A D=B*B ifC<D gotoL 1 B1
c. 删除多余运算
(3) 基本块内的优化为 。
d. 代码外提
a. 代码外提,删除归纳变量 b. 删除多余运算,删除无用赋值 c. 强度削弱,代码外提
d. 循环展开,循环合并
第五章 代码优化 (4) 在程序流图中,我们称具有下述性质 列为一个循环。 a. 它们是非连通的且只有一个入口结点 b. 它们是强连通的但有多个入口结点 c. 它们是非连通的但有多个入口结点 的结点序
d. 们是强连通的且只有一个入口结点
(5) 关于必经结点的二元关系,下列叙述中不正确的 是 。
a. 满足自反性
c. 满足反对称性 【解答】 (1) d (2) c (3) b
b. 满足传递性
d. 满足对称性 (4) d (5) d
第五章 代码优化 5.2 何谓局部优化、循环优化和全局优化?优化工作在
第五章 代码优化
A=0 I=1
B1
B2 L :B=J+1 1 C=B+I A=C+A if I=100 goto2L F I=I+1 goto L 1 B3 T L :write A B4 2 halt
图5-5 习题5.8的程序流图
第五章 代码优化 (2) 很容易看出,B3→B2是流图中的一条有向边, 并且有B2 DOM B3 ,故B3→B2 为流图中的一条回边。循
n2 n3
n5 L :I=I+1 4 if I<8 goto2L
n6 L :J=J+1 5 if J<=3 goto 1 L halt n7
图5-3 习题5.6的程序流图
第五章 代码优化 由于有n5→n2 和n6→n1 ,而n2 不是n5 的必经结点,n1 是n6 的必经结点,所以n6→n1 为回边;即该回边表示的
D(n4)={n0,n1,n3,n4}
D(n5)={n0,n1,n3,n5} D(n6)={n0,n1,n3,n6} D(n7)={n0,n1,n3,n6,n7} 程序流图如图5-3所示。
第五章 代码优化
J=0 n0
L :I=0 1 if I<8 goto3 L
n1
L :A=B+C 2 B=D*C L :if B=0 goto L 3 4 write B n 4 goto L 5
编译的哪个阶段进行? 【解答】 优化根据涉及的程序范围可分为三种。 (1) 局部优化是指局限于基本块范围内的一种优化。一 个基本块是指程序中一组顺序执行的语句序列(或四元式序
列),其中只有一个入口(第一个语句)和一个出口(最后一个
语句)。对于一个给定的程序,我们可以把它划分为一系列的 基本块,然后在各个基本块范围内分别进行优化。通常应用 DAG方法进行局部优化。
E=A*A B2 F=F+1 E=E+F write(E) halt
B3 L :E=B*B 1 F=F+2 E=E+F write(E) if E>100 goto2L halt B4 L :F=F-1 B5 2 goto L 1
图5-1 程序流图
第五章 代码优化 5.4 基本块的DAG如图5-2所示。若: (1) b在该基本块出口处不活跃;
结点之间必有一通路,L中任意两个结点之间亦必有一
通路。此外,由M中结点性质可知:d到M中任一结点ni 的通路上所有结点都应属于M,ni 到n的通路上所有结
点也都属于M。因此,L中任意两结点间通路上所有结
点都属于L,也即,L是强连通的。
第五章 代码优化 (2) 因为对所有ni∈L,都有d DOM ni,所以d必为L 的一个入口结点。我们说d也一定是L的唯一入口结点。 如不然,必有另一入口结点d1∈L且d1≠d。d1 不可能是 首结点,否则d DOM n不成立(因为有d DOM d1,如果d1 是首结点,则d就是首结点d1的必经结点,则只能是d=d1, 与d≠d1矛盾)。现设d1不是首结点,且设d1在L之外的前 驱是d2 ,那么,d2 和n之间必有一条通路d2→d1→…→n, 且该通路不经过d,从而d2应属于M,这与d2∈L矛盾。所 以不可能存在上述结点d1 ,也即d是循环的唯一入口结 点。 至此,我们已经满足了循环的定义:循环是程序流 图中具有唯一入口结点的强连通子图,也即,L是包含 回边n→d的循环,d是循环的唯一入口结点。
goto L5
L4:I= I+1 if I<8 goto L2 L5:J= J+1 if J<=3 goto L1
halt
第五章 代码优化 【解答】 (1) 各结点的必经结点集分别为 D(n0)={n0}
D(n1)={n0,n1}
D(n2)={n0,n1,n2} D(n3)={n0,n1,n3}
第五章 代码优化 (2) 循环优化是指对循环中的代码进行优化。例 如,如果在循环语句中某些运算结果不随循环的重复
执行而改变,那么该运算可以提到循环外,其运算结
果仍保持不变,但程序运行的效率却提高了。循环优 化包括代码外提、强度削弱、删除归纳变量、循环合
相关文档
最新文档