(完整版)编译原理第五章作业参考答案
编译原理-第1-5章习题课答案解析

不同的语法树,或者两种以上不同的最 左/右推导,则称这个文法是二义的。
首先:找到此文法对应的一个句子 iiiei 其次:构造与之对应的两棵语法树
S
S
i SeS
iS
iS
i
i S eS
i
ii
结论:因为该文法存在句子iiiei对应两棵 不同的语法树,因而该文法是二义的。
思路:先写出满足条件的正规式,由正规式构造 NFA,再把NFA确定化和最小化。
满足条件的正规式:(0|10)*
(0|10)*
x
y
1
0
1
0
0
1
2
0
x 1
y
编译原理
确定化: 给状态编号:
0
1
2
0
x 1
{X,1,Y} {1,Y} {2}
0
{1,Y} {1,Y} {1,Y}
0
0
1
1
1
2
1
chapter1~5习题
(1){0,1}上的含有子串010的所有串。 正规式:(0 | 1)* 010 (0 | 1)*
(2) {0,1}上不含子串010的所有串。 正规式:1*(0|11*1)* 1*( 0 | 11)*1* 1*0*1* (0 | 11)*(0 | 1) DFA做法同第7题。
编译原理
chapter1~5习题
编译原理
chapter1~5习题
8、给出下面正规表达式 (5)沒有重複出現的數字的數字符號串的全體
令ri=i| ,i=0,1,2...9 R0|R1|R2|...|R9記為∑Ri i (0,1,2...,9) P(0,1,2...,9)表示0,1,2...,9的全排列
编译原理-第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)所示。
(完整版)哈工大编译原理习题及答案

何谓源程序、目标程序、翻译程序、编译程序和解释程序它们之间可能有何种关系一个典型的编译系统通常由哪些部分组成各部分的主要功能是什么选择一种你所熟悉的程序设计语言,试列出此语言中的全部关键字,并通过上机使用该语言以判明这些关键字是否为保留字。
选取一种你所熟悉的语言,试对它进行分析,以找出此语言中的括号、关键字END以及逗号有多少种不同的用途。
试用你常用的一种高级语言编写一短小的程序,上机进行编译和运行,记录下操作步骤和输出信息,如果可能,请卸出中间代码和目标代码。
第一章习题解答1.解:源程序是指以某种程序设计语言所编写的程序。
目标程序是指编译程序(或解释程序)将源程序处理加工而得的另一种语言(目标语言)的程序。
翻译程序是将某种语言翻译成另一种语言的程序的统称。
编译程序与解释程序均为翻译程序,但二者工作方法不同。
解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。
即边解释边执行,翻译所得的指令序列并不保存。
编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。
即先翻译、后执行。
2.解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。
3.解:C语言的关键字有:auto break case char const continue default do double else enum externfloat for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while。
《编译原理》课后习题答案

第7 题证明下述文法G[〈表达式〉]是二义的。
〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉〈运算符〉∷=+|-|*|/答案:可为句子a+a*a 构造两个不同的最右推导:最右推导1 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉a=>〈表达式〉* a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a最右推导2 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a第8 题文法G[S]为:S→Ac|aB A→ab B→bc该文法是否为二义的?为什么?答案:对于串abc(1)S=>Ac=>abc (2)S=>aB=>abc即存在两不同的最右推导。
所以,该文法是二义的。
或者:对输入字符串abc,能构造两棵不同的语法树,所以它是二义的。
第9 题考虑下面上下文无关文法:S→SS*|SS+|a(1)表明通过此文法如何生成串aa+a*,并为该串构造语法树。
(2)G[S]的语言是什么?答案:(1)此文法生成串aa+a*的最右推导如下S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。
第10 题文法S→S(S)S|ε(1) 生成的语言是什么?(2) 该文法是二义的吗?说明理由。
答案:(1)嵌套的括号(2)是二义的,因为对于()()可以构造两棵不同的语法树。
第11 题令文法G[E]为:E→T|E+T|E-T T→F|T*F|T/F F→(E)|i证明E+T*F 是它的一个句型,指出这个句型的所有短语、直接短语和句柄。
编译原理 第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)文法。
编译原理作业题答案编译原理课后题答案

第二章高级语言的语法描述6、令文法G 6为:N →D|ND D → 0|1|2|3|4|5|6|7|8|9(1)G 6 的语言L (G 6)是什么?(2)给出句子01270127、、34和568的最左推导和最右推导。
解答:思路:由N N →→ D|ND 可得出如下推导N =>=>ND ND ND=>=>=>NDD NDD NDD=>…=>=>…=>=>…=>D D n(n >=1=1))可以看出,N 最终可以推导出1个或多个(也可以是无穷)D ,而D D →→ 0|1|2|3|4|5|6|7|8|9可知,每个D 为0~9中的任一个数字,所以,中的任一个数字,所以,N N N 最终推导出的就是由最终推导出的就是由0~9这10个数字组成的字符串。
(1)G 6 的语言L (G 6)是由0~9这10个数字组成的字符串个数字组成的字符串,,或{0{0,,1,1,……,9}+。
(2)(2)句子句子01270127、、34和568的最左推导分别为的最左推导分别为: : N =>=>ND ND ND=>=>=>NDD NDD NDD=>=>=>NDDD NDDD NDDD=>=>=>DDDD DDDD DDDD=>=>=>0DDD 0DDD 0DDD=>=>=>01DD 01DD 01DD=>=>=>012D 012D 012D=>=>=>0127 0127 N =>=>ND ND ND=>=>=>DD DD DD=>=>=>3D 3D 3D=>=>=>34 34N =>=>ND ND ND=>=>=>NDD NDD NDD=>=>=>DDD DDD DDD=>=>=>5DD 5DD 5DD=>=>=>56D 56D 56D=>=>=>568 568 句子01270127、、34和568的最右推导分别为的最右推导分别为: :N =>=>ND ND ND=>=>=>N7N7N7=>=>=>ND7ND7ND7=>=>=>N27N27N27=>=>=>ND27ND27ND27=>=>=>N127N127N127=>=>=>D127D127D127=>=>=>0127 0127 N =>=>ND ND ND=>=>=>N4N4N4=>=>=>D4D4D4=>=>=>34 34N =>=>ND ND ND=>=>=>N8N8N8=>=>=>ND8ND8ND8=>=>=>N68N68N68=>=>=>D68D68D68=>=>=>568 5687、写一个文法,使其语言是奇数集,且每个基数不以0开头。
程序设计语言_编译原理(第三版-习题库-答案)第五章 语法制导翻译及中间代码生成

第五章语法制导翻译及中间代码生成5.1说明属性文法与属性翻译文法有何异同?5.2考虑下面的属性文法:Z →sXattribution:Z.a=X.c;X.b=X.a;Z.p=X.b;Z →t Xattribution:X.b=X.d;Z.a=X.b;X →uattribution:X.d=1;X.c=X.d;X →Vattribuion:X.c=2;X.d=X.c;(1) 上述文法中的属性哪些是继承的?哪些是综合的?(2) 上述文法中的属性依赖是否出现了循环?5.3为什么说S属性文法一定是L属性文法?反之结论亦正确吗?5.4将下列中缀式改写为逆波兰式。
(1) -A*(B+C)↑(D-E)(2) ((a*d+c)/d+e)*f+g(3) a+x≤4∨(C∧d*3)(4) a∨b∧c+d*e↑f(5) s=0; i=1;while (i<=100) {s+=i*i; i++;}5.5将下列后缀式改写为中缀式。
(1) abc*+(2) abc-*cd+e/-(3) abc+≤a0>∧ab+0≠a0∧∨(4) ab<p1 BZ xab-c↑= p2 BR gh=↑↑p1p25.6设已给文法G[E]:E →E+T | -T | TT →T*F | FF →P ↑F | PP →(E) | i试设计一个递归下降分析器,要求此分析器在语法分析过程中,将所分析的符号串翻译成后缀式。
5.7设已给布尔表达式文法G[Z]:Z →EE →T{∨T}T →F{∧F}F → F | (E) | b试设计一个递归下降分析器,它把由G[Z]所描述的布尔表达式翻译为四元式序列。
5.8(1) 利用54节所给的属性翻译文法将赋值语句:X=A*(B+C)+D翻译成四元式序列,给出语法制导的翻译过程。
(2) 利用55节所给的属性翻译文法将布尔表达式:A∧(B∨(C∨D F))翻译成四元式序列,给出语法制导的翻译过程。
(3) 利用56节所给的属性翻译文法将语句:while A<C∧B>0 doif A=1 then C∶=C+1else while A<=D do A∶=A+2翻译成四元式序列,给出语法制导的翻译过程。
编译原理-第五章习题答案

上一页
下一页
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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(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)),a)的最左推导为
S (T)
(T,S)(S,a)
((T),a)
((T,S),a)
((T,S,S),a)
((S,
A,(T)),a)
(((T),A,(S)),a)
对每个非终结符写出不带回溯的递归子程序如下:
char CH;//存放当前的输入符号
void P_S()〃非终结符S的子程序
{
if(CH=='aREAD(CH);//产生式S a
else if(CH=='A') READ(C产生式SA
else if(CH=='产'生式S (T)
{
READ(CH);
P_T();
FIRST(T/)=FIRST(T)U{e}={(,a,b=e};
FIRST(F)=FIRST(P)={(,a,b,A};
FIRST(F)=FIRST(P)={*,£};
IF CH IN FIRST(x n) THEN P(x n)
ELSE IF CH IN FOLLOW(U) THEN RETURN
ERROR
(5) 要分析一个OrgStr,应在该串的后面加上一个串括号’#',并从子程序P(S)(S为文法的开始符号
如果中途没有产生错误,并且最后CH='#',则说明OrgStr串合法,否则该串不合法。
IF (CH= =') THEN 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的子程序
文法G[S]的预测分析表如下:
a
A
(
)
#
S
a
A
(T)
T
SU
SU
SU
U
e
,SU
(5)给岀输入串(a,a)#的分析过程
步骤
分析栈
剩余输入串
所用产生式
1
#S
(a,a)#
S (T)
2
#)T(
(a,a)#
(匹配
3
#)T
a,a)#
T SU
4
#)US
a,a)#
S a
5
#)Ua
a,a)#
a匹配
6
#)U
,a)#
U,SU
FIRST(S)={a,人,(}
FIRST(T)=FIRST(S)={a,人,(}
FIRST(U)={,,£}
各非终结符的FOLLOW!合如下:
FOLLOW(S)={#}UFIRST(U)UFOLLOW(T)UFOLLOW(U)={#,,,)}
FOLLOW(T)={)}
FOLLOW(U)=FOLLOW(T)={)}
每个产生式的SELECT集合如下:
SELECT(S a)={a}
SELECT(SA)={A}
SELECT(S (T))={(}
SELECT(T SU)=FIRST(S)={a,A,(}
SELECT(U,SU)={,}
SELECT(Ue)=FOLLOW(U)={)}
可见,相同左部产生式的SELECT集的交集均为空,所以文法G[S]是LL(1)文法
第五章 自顶向下语法分析方法
1•对文法G[S]
S a|A|(T)
T T,S|S
(1)给岀(a,(a,a))和(((a,a),A,(a)),a)的最左推导。
(2)对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3)经改写后的文法是否是LL(1)的?给岀它的预测分析表。
(4)给岀输入串(a,a)#的分析过程,并说明该串是否为G的句子。
(((T,S),A,(a)),a)
(((S,a),
A,(a)),a)
(((a,a),
A,(a)),a)
⑵由于有T T,S的产生式,所以消除该产生式的左递归,增中一个非终结符U有新的文法G[S]:
S a|A|(T)
T SU
U,SU|£
分析子程序的构造方法
对满足条件的文法按如下方法构造相应的语法分析子程序。
(3)构造它的预测分析表。
(4)构造它的递归下降分析程序。
解:
(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。
FIRST集合有:
FIRST(E)=FIRST(T)=FIRST(F)=FIRST({+,e}
FIRST(T)=FIRST(F)=FIRST(P)={(,a,br};
ELSE ERROR
其中,CH存放当前的输入符号,是一个全程变量;ERROR1一段处理岀错信息的程序;
P(xj)为相应的子程序。
⑶对于符号串x=y1y2...y n;p(x)的含义为:
BEGIN
P(y1);
P(y2);
P(y n);
END
如果yi是非终结符,则P(yi)代表调用处理yi的子程序;
如果yi是终结符,则P(yi)为形如下述语句的一段子程序
{
if(CH==',产生式U,SU
{
READ(CH);
P_S();
P_U();
}
else//产生式U£
{
if(IsIn(CH,FOLLOW_U)) //FOLLOW_U为U的FOLLOW集合
return ;
else ERR;
}
}
⑶判断文法G[S]是否为LL(1)文法。
各非终结符的FIRST集合如下:
IF CH=yi THEN READ(CH) ELSE ERROR
即如果当前文法中的符号与输入符号匹配,则继续读入下一个待输入符号到CH中,
否则表明出错。
⑷如果文法中有空规则U::=EPSILON,则算法中的语句
IF CH IN FIRST(x n) THEN P(x n)
ELSE ERROR
改写为:
(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(x n) THEN P(x n)
7
#)US,
,a)#
,匹配
8
#)US
a)#
S a
9
#)Ua
a)#
a匹配
10
#)U
)#
Ue
11
#)
)#
)匹配
12
#
#
接受
2.对下面的文法G:
E TE
E +E|e
T FT
T/T|e
f pF
F/*F/|e
P (E)|a|bF
(1)计算这个文法的每个非终结符的FIRST集和FOLLOW!。
⑵证明这个方法是LL(1)的。