蒋立源编译原理第三版第四章 习题与答案1
编译原理_第三版_课后答案

{2,3,5,7,9,10} {2,4,5,7,8,10} {2,4,5,7,8,10} {11} {6} ห้องสมุดไป่ตู้ {2,5,7,8,10} φ φ
{2,3,5,7,10} {2,3,5,7,9,10} φ φ
{11} {11} φ φ S
{6} {6} φ φ
3: 5: 6: S a b S S A a b A a A S b A
文法: (1) 最左推导: 最右推导: (2) (((a,a),^,(a)),a) (((S,a),^,(a)),a) (((T,a),^,(a)),a) (((T,S),^,(a)),a) (((T),^,(a)),a)
((S,^,(a)),a) ((T,^,(a)),a) ((T,S,(a)),a) ((T,(a)),a) ((T,(S)),a) ((T,(T)),a) ((T,S),a) ((T),a) (S,a) (T,S) (T) S “移进-归约”过程: 步骤 栈 输入串 动作 0 # (((a,a),^,(a)),a)# 预备 1 #( ((a,a),^,(a)),a)# 进 2 #(( (a,a),^,(a)),a)# 进 3 #((( a,a),^,(a)),a)# 进 4 #(((a ,a),^,(a)),a)# 进 5 #(((S ,a),^,(a)),a)# 归 6 #(((T ,a),^,(a)),a)# 归 7 #(((T, a),^,(a)),a)# 进 8 #(((T,a ),^,(a)),a)# 进 9 #(((T,S ),^,(a)),a)# 归 10 #(((T ),^,(a)),a)# 归 11 #(((T) ,^,(a)),a)# 进 12 #((S ,^,(a)),a)# 归 13 #((T ,^,(a)),a)# 归 14 #((T, ^,(a)),a)# 进 15 #((T,^ ,(a)),a)# 进 16 #((T,S ,(a)),a)# 归 17 #((T ,(a)),a)# 归 18 #((T, (a)),a)# 进 19 #((T,( a)),a)# 进 20 #((T,(a )),a)# 进 21 #((T,(S )),a)# 归 22 #((T,(T )),a)# 归
编译原理第4章习题答案

S-> S’ S’->(S)SS’| First( (S)SS’) = { ( } Follow(S)=Follow(S’)= { (, ),$ }
预测分析表
非终结符 S ( S->S’ ) S->S’ $ S->S’
S’
S’->(S)SS’
S’->
S’->
S’->
冲突
仔细分析后,发现该文法 S->S(S)S| 是二义性文法。 二义性文法不可能是LL(1)文法。 例如:( ) ( )
S->aS’ S’->aS’AS’|Ɛ A->+|*
First(S) = First(aS’)={a} First(S’)= First(aS’AS’) ∪ First(Ɛ)= {a} ∪{Ɛ}= {a, Ɛ} First(A) = { +,*}
Follow(S) ={$} 因为 S->aS’,所以把Follow(S)加入到Follow(S’)中。 因为 S’->aS’AS’的第一个S’ ,所以把First(AS’)={+,*}加入到Follow(S’)中。 因为 S’->aS’AS’的第二个S’ ,所以Follow(S)加入到Follow(S’)中。 所以,Follow(S’)= {$, +,*} 对 S’->aS’AS’的A ,当A后面的S’推导出非空时,把First(S’)-{Ɛ}={a}加入到Follow(A)中。 对 S’->aS’AS’的A ,当A后面的S’推导出空时,把Follow(S’)={$,+,*}加入到Follow(A)中。 所以,Follow(A)= {a, +,*,$} 对于S’->aS’AS’|Ɛ,因为First(aS’AS’) ∩Follow(S’)={a} ∩{$,+,*}=空集,所以没有冲突。 对于A->+|*,因为First(+) ∩First(*)={+} ∩{*}=空集,所以没有冲突。 所以该文法是LL(1)文法。
蒋立源编译原理第三版第四章习题与答案.docx

第五章习题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→E E→E+T |T1T →T T→T*F|F F→(E)|i11111其相应的简单优先矩阵如题图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 )进行算符优先分析的过程。
(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 →AA→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 的分析过程。
编译原理第四章参考答案

编译原理第四章参考答案1.1考虑下⾯⽂法G1S->a|^|(T)T->T,S|S消去G1的左递归。
然后对每个⾮终结符,写出不带回溯的递归⼦程序。
答::(1)消除左递归:S->a|^|(T)T-> ST’T’->,S T’|ε(2)first(S)={ a , ^ , ( } first(T)= { a , ^ , ( } first(T’)={ , ε}First(a)={a},First(^)={^},First( (T) )={ ( }S的所有候选的⾸符集不相交First(,ST’)={,} ,First(ε)={ε},T’的所有候选的⾸符集不相交Follow(T’)=Follow(T)={ )}first(T’)∩Follow(T’)={}所以改造后的⽂法为LL(1)⽂法。
不带回溯的递归⼦程序如下:S( ){if (lookahead=’a’) advance;Else if(lookahead=’^’) advance;Else if(lookahead=’(’){advance;T();if(lookahead=’)’) advance;else error();}Else error();}T( ){S( );T’( ):}T’->,S T’|εT’( ){if (lookahead=’,’){advance;T’();}Else if(lookahead=Follow(T’)) advance;Else error;}有⽂法G(S):S→S+aF|aF|+aFF→*aF|*a(1)改写⽂法为等价⽂法G[S’],消除⽂法的左递归和回溯(2)构造G[S’]相应的FIRST和FOLLOW集合;(3)构造G[S’]的预测分析表,以此说明它是否为LL(1)⽂法。
(4)如果是LL(1)⽂法,请给出句⼦a*a+a*a*a的预测分析过程该⽂法为LL(1)⽂法,因为它的预测分析表中⽆冲突项。
编译原理第三版课后习题答案

编译原理第三版课后习题答案编译原理是计算机科学中的一门重要课程,它研究的是如何将高级程序语言转换为机器语言的过程。
而《编译原理》第三版是目前被广泛采用的教材之一。
在学习过程中,课后习题是巩固知识、提高能力的重要环节。
本文将为读者提供《编译原理》第三版课后习题的答案,希望能够帮助读者更好地理解和掌握这门课程。
第一章:引论习题1.1:编译器和解释器有什么区别?答案:编译器将整个源程序转换为目标代码,然后一次性执行目标代码;而解释器则逐行解释源程序,并即时执行。
习题1.2:编译器的主要任务是什么?答案:编译器的主要任务是将高级程序语言转换为目标代码,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。
第二章:词法分析习题2.1:什么是词法分析?答案:词法分析是将源程序中的字符序列划分为有意义的词素(token)序列的过程。
习题2.2:请给出识别下列词素的正则表达式:(1)整数:[0-9]+(2)浮点数:[0-9]+\.[0-9]+(3)标识符:[a-zA-Z_][a-zA-Z_0-9]*第三章:语法分析习题3.1:什么是语法分析?答案:语法分析是将词法分析得到的词素序列转换为语法树的过程。
习题3.2:请给出下列文法的FIRST集和FOLLOW集:S -> aAbA -> cA | ε答案:FIRST(S) = {a}FIRST(A) = {c, ε}FOLLOW(S) = {$}FOLLOW(A) = {b}第四章:语义分析习题4.1:什么是语义分析?答案:语义分析是对源程序进行静态和动态语义检查的过程。
习题4.2:请给出下列文法的语义动作:S -> if E then S1 else S2答案:1. 计算E的值2. 如果E的值为真,则执行S1;否则执行S2。
第五章:中间代码生成习题5.1:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。
编译原理第四章答案

First( A' ) Follow ( A' ) {d , } {), b}
4.4(2)
见课后答案 规则见课本P66
问题?
Select( E gAf ) Select( E c) First( gAf ) Frist(c) {g} {c}
4.2
对下面的文法G: E→TE’ E’→+TE’|ε T→FT’ T’→*FT’|ε F→(E)|id (1)计算这个文法的每个非终结符的FIRST和FOLLOW。 (2)证明这个文法是LL(1)的。 (3)构造它的预测分析表。 (4)构造它的递归下降分析程序。
第四章习题
4.1 4.2 4.3 4.4
4.1
1、考虑下面文法G[A]: A→BCc|gDB B→bCDE|ε C→DaB|ca D→dD|ε E→gAf|c (1)FIRST集和FOLLOW集 (2)是否是LL(1)文法。
4.1(1) First集
First( A) First( BCc) First( gDB) First( B) \ { } First(C ) {g} {b} First( D) \ { } {a} First(ca) {g} {b} {d } {a} {c} {g} {a, b, c, d , g}
E’→ε T→FT ’ T’→ε F→idFra bibliotekE’→ε
T’→ε
4.2(4)
规则见课本P66 见课后答案 E→TE’ T→FT’ F→(E)|id E’→+TE’|ε T’→*FT’|ε
4.3
文法G[S]: S→A A→B|AiB B→C|B+C C→)A*|( 1)改写为LL(1)文法 2)求改写后的文法的每个非终结符的First集和Follow集 3)构造相应的预测分析表
程序设计语言编译原理第三版第4章

步骤 分析栈 1 #E 2 #ET
剩余输入串 i+i*i# i+i*i#
所用产生式 ETE TFT
步骤 分析栈 2 #ET 3 #ETF 4 #ETi 5 #ET 6 #E
剩余输入串 i+i*i# i+i*i# i+i*i# +i*i# +i*i#
所用产生式
TFT
即:
若此候选获得成功匹配,那么,这种匹配决不会是虚假的; 若此候选无法完成匹配任务,则任何其它候选也肯定无法完成。
§4.3 LL(1)分析法
例:Aα 1|α 2|…|α n
设A所面临的第一个输入符号为a,若A能根据不同 的输入符号指派相应的候选α i作为全权代表去执行任务, 那就肯定无需回溯。在这里A已不再是让某个候选去试探 性地执行任务,而是根据所面临的输入符号a准确地指派 唯一的一个候选。
S x Ay
S x Ay **
S x Ay
*
§4.2 自上而下面临的问题
实现上述带回溯试探法的简单途径: 让每个非终结符对应一个递归子程序。每
个这种子程序可作为一个布尔过程。一旦发现 它的某个候选与输入串相匹配,就用这个候选 去扩展语法树,并返回“真”值;否则,保持原 来的语法树和IP值不变,并返回“假”值。
1. 规则:(直接左递归消除) PPα|β
PβP’ P’αP’|ℇ
PPα1|Pα2|…Pαm|β1|β2|…|βn Pβ1p’|β2P’|…|βnP’ P’α1P’|α2P’|…|αmP’|ℇ
§4.3 LL(1)分析法
例题:
已经文法:EE+T|T TT*F|F F(E)|i
ETE’ E’+TE’|ℇ TFT’ T’*FT’|ℇ F(E)|i
(完整版)编译原理课后答案(第三版蒋立源康慕宁编)

编译原理课后答案(第三版蒋立源康慕宁编)第一章习题解答1解:源程序是指以某种程序设计语言所编写的程序。
目标程序是指编译程序(或解释程序)将源程序处理加工而得的另一种语言(目标语言)的程序。
翻译程序是将某种语言翻译成另一种语言的程序的统称。
编译程序与解释程序均为翻译程序,但二者工作方法不同。
解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。
即边解释边执行,翻译所得的指令序列并不保存。
编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。
即先翻译、后执行。
2解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。
3解:C语言的关键字有:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while。
上述关键字在C语言中均为保留字。
4解:C语言中括号有三种:{},[],()。
其中,{}用于语句括号;[]用于数组;()用于函数(定义与调用)及表达式运算(改变运算顺序)。
C语言中无END关键字。
逗号在C语言中被视为分隔符和运算符,作为优先级最低的运算符,运算结果为逗号表达式最右侧子表达式的值(如:(a,b,c,d)的值为d)。
5略第二章习题解答1.(1)答:26*26=676(2)答:26*10=260(3)答:{a,b,c,...,z,a0,a1,...,a9,aa,...,az,...,zz,a00,a01,...,zzz},共26+26*36+26*36*36=34658个2.构造产生下列语言的文法(1){anbn|n≥0}解:对应文法为G(S) = ({S},{a,b},{ S→ε| aSb },S)(2){anbmcp|n,m,p≥0}解:对应文法为G(S) = ({S,X,Y},{a,b,c},{S→aS|X,X→bX|Y,Y→cY|ε},S)(3){an # bn|n≥0}∪{cn # dn|n≥0}解:对应文法为G(S) = ({S,X,Y},{a,b,c,d,#}, {S→X, S→Y,X→aXb|#,Y→cYd|# },S)(4){w#wr# | w?{0,1}*,wr是w的逆序排列}解:G(S) = ({S,W,R},{0,1,#}, {S→W#, W→0W0|1W1|# },S)(5)任何不是以0打头的所有奇整数所组成的集合解:G(S) = ({S,A,B,I,J},{-,0,1,2,3,4,5,6,7,8,9},{S→J|IBJ,B→0B|IB|e, I→J|2|4|6|8, Jà1|3|5|7|9}, S)(6)所有偶数个0和偶数个1所组成的符号串集合解:对应文法为S→0A|1B|e,A→0S|1C B→0C|1S C→1A|0B3.描述语言特点(1)S→10S0S→aAA→bAA→a解:本文法构成的语言集为:L(G)={(10)nabma0n|n, m≥0}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4章习题1
4-1 消除下列文法的左递归性。
(1) S→SA|A A→SB|B|(S)|( ) B→[S]|[ ]
(2) S→AS|b A→SA|a
(3) S→(T)|a|ε T→S|T,S
4-2 对于如下文法,求各候选式的FIRST集和各非终结符号的FOLLOW集。
S→aAB|bA|ε A→aAb|ε B→bB|ε
4-3 验证下列文法是否为LL(1)文法。
(1) S→AB|CDa A→ab|c B→dE|ε
C→eC|ε D→fD|f E→dE|ε
(2) S→aABbCD|ε A→ASd|ε B→SAc|eC|ε
C→Sf|Cg|ε D→aBD|ε
4-4 对于如下的文法G[S]:
S→Sb|Ab|b
A→Aa|a
(1) 构造一个与G等价的LL(1)文法G′[S];
(2) 对于G′[S],构造相应的LL(1)分析表;
(3) 利用LL(1)分析法判断符号串aabb是否是文法G[S]的合法句子。
4-5 设已给文法
S→SaB|bB A→S|a B→Ac
(1) 构造一个与G等价的LL(1)文法G′[S];
(2) 对于G′[S],构造相应的LL(1)分析表;
(3) 利用LL(1)分析法判断符号串bacabc是否是文法G[S]的合法句子。
第4章习题答案
4-1 解:
(1) 文法G[S]中的S,A都是间接左递归的非终结符号。
将A产生式的右部代入产生式
S→A
中,得到与原文法等价的文法G′[S]:
S→SA|SB|B|(S)|( )
A→SB|B|(S)|( )
B→[S]|[ ]
文法G′[S]中的S是直接左递归的非终结符号,则消除S产生式的直接递归性后,我们便得到了与原文法等价且无任何左递归性的文法G"[S]:
S→BS′|(S)S′|( )S′
S′→AS′|BS′|ε
A→SB|B|(S)|( )
B→[S]|[ ]
(2) 文法G[S]中的S,A都是间接左递归的非终结符号。
将A产生式代入产生式
S→AS
中,得到与原文法等价的文法G′[S]:
S→SAS|aS|b
A→SA|a
文法G′[S]中的S是直接左递归的非终结符号,则消除S产生式的直接递归性后,我们便得到了与原文法等价且无任何左递归性的文法G"[S]:
S→aSS′|bS′
S′→ASS′|ε
A→SA|a
(3) 文法G[S]中的T是直接左递归的非终结符号。
则消除T产生式的直接递归性后,
我们便得到了与原文法等价且无任何左递归性的文法G′[S]:
S→(T)|a|ε
T→ST′
T′→,ST′|ε
4-2 解:
文法G[S]的各候选式的FIRST集和各非终结符号的FOLLOW集如答案表4-2所示。
答案表4-2 文法G[S]的各个FIRST集和FOLLOW集
4-3 解:
(1) 因为D产生式的两个候选式fD和f的FIRST集交集为f,不为空,所以该文法不是LL(1)的。
(2) 因为文法中含有左递归的非终结符号A,故此文法具有左递归性,不是LL(1)的。
4-4 解:
(1) 文法中含有直接左递归的非终结符号S和A,则消除直接递归性后,我们便得到了与原文法等价且无任何左递归性的文法G′[S]::
S→AbS′|bS′
S′→bS′|ε
A→aA′
A′→aA′|ε
文法G′[S]的各候选式的FIRST集和各非终结符号的FOLLOW集如答案表4-4-(1)所示: 答案表4-4-(1) 文法G′[S]的各个FIRST集和FOLLOW集
下面来验证文法G′[S]是否是LL(1)文法。
对于文法G′[S],因为有:
对于产生式S→AbS′|bS′,有FIRST(AbS′)∩FIRST(bS′)={a}∩{b}=∅;
对于产生式S′→bS′|ε,有FIRST(bS′)∩FOLLOW(S′)={b}∩{#}=∅;
对于产生式A′→aA′|ε,有FIRST(aA′)∩FOLLOW(A′)={a}∩{b}=∅;
所以文法G′[S]即为所求的与G等价的LL(1)文法。
(2) 文法G′[S]的LL(1)分析表如答案表4-4-(2)所示:
答案表4-4-(2) 文法G′[S]的LL(1)分析表
(3) 对符号串aabb进行LL(1)分析的过程如答案表4-4-(3)所示。
答案表4-4-(3) 对aabb进行LL(1)分析的过程
因为分析成功,所以符号串aabb是文法G[S]的合法句子。
4-5 解:
(1) 文法中含有直接左递归的非终结符号S,则消除直接递归性后,我们便得到了与原文法等价且无任何左递归性的文法G′[S]::
S→bBS′
S′→aBS′|ε
A→S|a
B→Ac
文法G′[S]的各候选式的FIRST集和各非终结符号的FOLLOW集如答案表4-5-(1)所示: 答案表4-5-(1) 文法G′[S]的各个FIRST集和FOLLOW集
下面来验证文法G′[S]是否是LL(1)文法。
对于文法G′[S],因为有:对于产生式S′→aBS′|ε,有FIRST(aBS′)∩FOLLOW(S′)={a}∩{#,c}=∅;对于产生式A→S|a,有FIRST(S)∩FIRST(a)={b}∩{a}=∅;
所以文法G′[S]即为所求的与G等价的LL(1)文法。
(2) 文法G′[S]的LL(1)分析表如答案表4-5-(2)所示:
答案表4-5-(2) 文法G′[S]的LL(1)分析表
(3) 对符号串bacabc进行LL(1)分析的过程如答案表4-5-(3)所示。
答案表4-5-(3) 对bacabc进行LL(1)分析的过程
因为LL(1)分析表中B行c列元素为空,即为“出错”,故分析失败,所以符号串bacabc不是文法G[S]的合法句子。