编译原理分知识点习题自上而下语法分析 1Word下载.docx
《编译原理分知识点习题自上而下语法分析 1Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理分知识点习题自上而下语法分析 1Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
约定输入符号串以“#”作为输入结束符。
P(E)的递归子程序为:
PROCEDUREP(E);
BEGIN
IFWORDINFIRST(Aa)
THEN
BEGIN
P(A);
READAWORD;
IFWORD=’a’
THENREADAWORD
ELSEERROR
END
ELSEIFWORDINFIRST(Bb)
THEN
P(B);
IFWORD=’b’
ELSEERROR
END;
P(A)的递归子程序为:
PROCEDUREP(A);
IFWORDD=’c’
P(A)
ELSEIFWORD=’e’
READWORD;
P(B)
P(B)的递归子程序为:
PROCEDUREP(B);
IFWORD=’b’
IFWORD=’d’
主程序中的主要内容为:
READAWORD;
P(E);
IFWORD=”#”
THENWRITE(“RIGHT!
”)
ELSEWRITE(“ERROR!
3.已知文法G[E]:
G[E]:
E→E+T|T
T→T*F|F
F→i|(E)
请按递归子程序法为其构造语法分析程序。
本题所给文法存在左递归,不满足递归子程序法对文法的要求,必须首先消除文法左递归,然后再构造分析程序。
因为文法只有左递归,采用扩充的BNF范式消除文法左递归得到:
E→T{+T}
T→F{*F}
然后再应用书中介绍的方法即可求解。
假定用“ADVANCE;
”表示对读取下一个单词的过程的调用。
相应的递归子程序为:
PROCEDUREP(E);
BEGIN
P(T);
WHILESYM=’+’DO
BEGIN
ADVANCE;
P(T)
END
END;
PROCEDUREP(T);
P(F);
WHILESYM=’*’DO
BEGIN
ADVANCE;
P(F)
PROCEDUREP(F);
IFSYM=’i’THENADVANCE
ELSEIFSYM=’(’THEN
IFSYM=’)’THENADVANCE
ELSEERROR
ELSEERROR
主程序中的主要内容为:
ADVANCE;
P(E);
IFWORD=”#”
THENWRITE(“RIGHT!
ELSEWRITE(“ERROR!
4.文法G[M]是否是LL
(1)文法,说明理由。
G[M]:
M→TB
T→Ba|ε
B→Db|eT|ε
D→d|ε
本题考查LL
(1)方法对文法的要求,涉及到FIRST集、FOLLOW集的求法。
首先求出文法的每一个非终结符号的FIRST集、FOLLOW集:
FIRST(D)=FIRST(d)∩FIRST(ε)={d,ε}
FIRST(B)=FIRST(Db)∩FIRST(eT)∩FIRST(ε)
=FIRST(db)∩FIRST(b)∩FIRST(eT)∩FIRST(ε)
={d,b,e,ε}
FIRST(T)=FIRST(Ba)∩FIRST(ε)={d,b,e,a,ε}
FIRST(M)=FIRST(Tb)={d,b,e,a,ε}
FOLLOW(M)={#}
FOLLOW(B)=FOLLOW(M)∪FIRST(a)\{ε}={a,#}
FOLLOW(T)=FOLLOW(B)\{ε}∪FOLLOW(M)∪FOLLOW(B)={d,b,e,#,a}
FOLLOW(D)=FIRST(b)\{ε}={b}
可以看出,对文法G[M]的产生式T→Ba|ε,有
FIRST(Ba)∩FOLLOW(T)={d,b,e,a}∩{d,b,e,#,a}={d,b,e,a}≠ø
仅此一条就会导致在自上而下的语法分析过程中出现回朔。
所以文法G[M]不是LL
(1)文法。
5.构造一个LL
(1)文法G,识别语言L:
L={ω|ω为{0,1}上不包括两个相邻的1的非空串}
并证明你的结论。
本题考查文法的构造方法以及LL
(1)文法的要求。
首先构造出描述该语言的文法,然后证明该文法是LL
(1)文法。
(1)根据题目要求——句子为不包括两个相邻的1的非空串,首先得到一个能够描述所有句子的文法
S→0S|1A|0|1
A→0S|0
再根据LL
(1)文法的要求,将文法改写为
G[S]:
S→0B|1C
A→0B
B→S|ε
C→A|ε
(2)下面证明文法G[S]是LL
(1)文法。
对产生式S→0B|1C,没有空产生式右部(ε),所以只要考查终结首符号集是否两两互不相交。
有
FIRST(0B)∩FIRST(1C)={0}∩{1}=ø
对产生式A→0B,只有唯一的不为空ε的右部,不用考查。
对产生式B→S|ε,因为有空产生式右部,所以要考查终结首符号集与后继终结符号集是否相交。
由于
FIRST(S)={0,1}FIRST(ε)={ε}
FOLLOW(B)=FOLLOW(S)∪FOLLOW(A)=FOLLOW(S)∪FOLLOW(C)
=FOLLOW(S)={#}∪FOLLOW(B)={#}
所以有
FIRST(S)∩FIRST(ε)=ø
和FIRST(B)∩FOLLOW(B)=ø
对产生式C→A|ε,因为有空产生式右部,所以要考查终结首符号集与后继终结符号集是否相交。
FIRST(A)={0}FIRST(ε)={ε}
FOLLOW(C)=FOLLOW(S)={#}
FIRST(A)∩FIRST(ε)=ø
和FIRST(C)∩FOLLOW(C)=ø
综上所述,文法G[S]的每一条形如U→X1|X2|…|Xn的产生式都满足
FIRST(Xi)∩FIRST(Xj)=ø
(i≠j)
如果Xj
ε时,还满足
FIRST(X1)∩FOLLOW(U)=ø
所以,文法G[S]是LL
(1)文法。
6.有文法G[S]:
S→aABbcd|ε
A→ASd|ε
B→SAh|eC|ε
C→Sf|Cg|ε
D→aBD|ε
①求每一个非终结符号的FOLLOW集合。
②对每一个非终结符号的产生式选择,构造FIRST集合。
③该文法是LL
(1)文法吗?
解:
本题考查LL
(1)文法的要求,涉及文法符号串FIRST集,文法非终结符号的FOLLOW集的求法。
首先将文法压缩,得到
①求每一个非终结符号的FOLLOW集合:
∵S为开始符号,且有产生式A→ASdB→SAhC→Sf
∴FOLLOW(S)={#}∪FIRST(d)∪FIRST(Ah)∪FIRST(f)={#,d,a,h,f}
∵S→aABbcdA→ASdB→SAh
∴FOLLOW(A)=FIRST(Bbcd)∪FIRST(Sd)∪FIRST(h)={b,a,d,h,e}
∵S→aABbcd
∴FOLLOW(B)=FIRST(bcd)={b}
∵B→eCC→Cg
∴FOLLOW(C)=FOLLOW(B)∪FIRST(g)={b,g}
②对每一个非终结符号的产生式右部选项,构造FIRST集合
对S:
FIRST(aABbcd)={a}FIRST(ε)={ε}
对A:
FIRST(ASd)={a,d}FIRST(ε)={ε}
对B:
FIRST(SAh)={a,d,h}FIRST(eC)={e}FIRST(ε)={ε}
对C:
FIRST(Sf)={a,f}FIRST(Cg)={a,f,g}FIRST(ε)={ε}
③由于存在产生式C→Sf|Cg|ε
FIRST(Sf)∩FIRST(Cg)={a,f}∩{a,f,g}≠ø
所以该文法不是LL
(1)文法。
7.已知文法
G[A]:
A→aAa|ε
(1)该文法是LL
(1)文法吗?
为什么?
(2)若采用LL
(1)方法进行语法分析,如何得到该文法的LL
(1)分析表?
(3)若输入符号串“aaaa”,请给出语法分析过程。
(4)请给出该文法的递归下降分析子程序。
(1)因为产生式A→aAa|ε有空产生式右部,而
FOLLOW(A)={#}∪FIRST(a)={a,#}
造成FIRST(A)∩FOLLOW(A)={a,ε}∩{a,#}≠ø
所以该文法不是LL
(1)文法。
(2)若采用LL
(1)方法进行语法分析,必须修改该文法。
因该文法产生偶数(可以为0)个a,所以得到文法
G’[A]:
A→aaA|ε
此时对产生式A→aaA|ε,有FOLLOW(A)={#}∪FOLLOW(A)={#},因而
FIRST(A)∩FOLLOW(A)={a,ε}∩{#}=ø
所以文法G’[A]是LL
(1)文法,按LL
(1)分析表构造算法构造该文法的LL
(1)分析表如表5.1所示。
表5.1文法G’[A]的LL
(1)分析表
A
#
A→aaA
A→ε
(3)若采用LL
(1)方法进行语法分析,对符号串“aaaa”的分析过程如表5.2所示
表5.2对符号串“aaaa”的分析过程
步骤
分析栈
输入串
产生式/动作
1
#A
aaaa#
2
#Aaa
匹配
3
#Aa
aaa#
4
aa#
5
6
a#
7
8
接受
(4)构造文法G’[A]的递归子程序如下(假定用“ADVANCE;
”表示对读取下一个单词的过程的调用):
PROCEDUREP(A);
IFWORD=’a’
THENBEGINADVANCE;
IFWORD=’a’
THENBEGINREADAWORD;
P(A);
END
ELSEERROR
END
ELSEIFNOT(WORDINFOLLOW(A))
THENERROR
END;
主程序中的主要内容为:
ADVANCE;
P(A);
IFWORD=”#”
THENWRITE(“RIGHT!
ELSEWRITE(“ERROR!
8.设文法G[S]:
S→SbA|aA
B→Sb
A→Bc
①将该文法改写成LL
(1)文法。
②求文法的每一个非终结符号的FIRST集合和FOLLOW集合。
③构造相应的LL
(1)分析表。
XX文库-让每个人平等地提升自我解:
本题考查“LL
(1)文法”的概念及LL
(1)分析表的构造方法,涉及文法符号串的FIRST集,文法非终结符号的FOLLOW集的求法。
因为S→SbA|aA有左递归,将其改写为
S→aA{bA}
文法变为
G’[S]:
S→aA{bA}
B→Sb
A→Bc
文法G’[S]满足LL
(1)文法的条件
②文法G’[S]中每一个非终结符号的FIRST集合为
FIRST(S)={a}FIRST(A)={a}FIRST(B)={a}
文法G’[S]中每一个非终结符号的FOLLOW集合为
∵S为开始符号,且有产生式B→Sb
∴FOLLOW(S)={#}∪FIRST(b)={#,b}
∵S→aA{bA}
∴FOLLOW(A)=FIRST(bA)\{ε}∪FOLLOW{S}={#,b}
∵A→Bc
∴FOLLOW(B)=FIRST{c}\{ε}={c}
③构造相应的LL
(1)分析表
∵FIRST(aA{bA})={a}∴M[S,a]=’S→aA{bA}’
∵FIRST(A)={a}∴M[A,a]=’B→Bc’
∵FIRST(B)={a}∴M[B,a]=’B→Sb’
文法G[S]的分析表如表5.3所示。
表5.3文法G[S]的分析表
a
b
c
S
A→Bc
B
B→Sb
9.考虑文法G:
A→A∨B|B
B→B∧C|C
C→﹁D|D
D→(A)|i
①试问该文法是否是LL
(1)文法,为什么?
②写出与该文法等价的LL
(1)文法G1。
③构造G1的LL
(1)分析表。
本题考查LL
(1)文法的要求,以及LL
(1)分析表构造方法,涉及文法符号串的FIRST集合的求法,文法非终结符号的FOLLOW集合求法。
①该文法不是LL
(1)文法。
因为对产生式A→A∨B|B,有
FIRST(A∨B)∩FIRST(B)=FIRST(B)≠ø
不满足LL
(1)文法的条件。
②构造与该文法等价的LL
(1)文法G1。
这一问题实际上是要使该文法满足LL
(1)文法的要求。
文法含有左递归,将导致无限循环。
将文法消除左递归,得G1
A→BA’
A’→∨BA’|ε
B→CB’
B’→∧CB’|ε
对产生式A’→∨BA’|ε,有
FIRST(∨BA’)∩FOLLOW(A’)={∨}∩{#,)}=ø
对产生式B’→∧CB’|ε,有
FIRST(∧CB’)∩FOLLOW(B’)={∧}∩{#,),∨}=ø
对产生式C→﹁D|D,有
FIRST(﹁D)∩FIRST(D)={﹁}∩{(,i}=ø
对产生式D→(A)|i,有
FIRST((A))∩FIRST(i)={(}∩{i}=ø
文法中其他产生式都只有一个非空(ε)的右部,所以文法G1已满足LL
(1)文法的要求。
③因为
对产生式A→BA’有FIRST(BA’)={﹁,(,i}
对产生式B→CB’有FIRST(CB’)={﹁,(,i}
对产生式A’→∨BA’|ε有FIRST(∨BA’)={∨}和FOLLOW(A’)={#,)}
对产生式B’→∧CB’|ε有FIRST(∧CB’)={∧}和FOLLOW(B’)={∨,#,)}
对产生式C→﹁D|D有FIRST(﹁D)={﹁}和FIRST(D)={(,i}
对产生式D→(A)|i有FIRST((A))={()和FIRST(i)={i}
所以文法G1的LL
(1)分析表如表5.4所示。
表5.4文法G1的LL
(1)分析表
∨
∧
﹁
(
)
i
BA’
A’
∨BA’
ε
CB’
B’
∧CB’
C
﹁D
D
(A)
10.已知文法G[A]为:
A→aABe|a
B→Bb|d
(1)试给出与G[A]等价的LL
(1)文法G’[A]。
(2)构造G’[A]的预测分析表并给出输入串aade#的分析过程。
本题考查“LL
(1)文法”的条件,LL
(1)分析表的构造方法和LL
(1)语法分析过程等内容。
预测分析表就是LL
(1)分析表。
(1)文法G[A]不是LL
(1)文法,原因在于:
①存在产生式A→aABe|a,使得
FIRST(aABe)∩FIRST(a)={a}≠ø
将造成语法分析过程中出现回朔。
②存在含有左递归的产生式B→Bb|d,使得语法分析过程中会出现无限循环。
要构造与G[A]等价的LL
(1)文法,实质上就是要修改原文法中存在上述两种问题的产生式。
对产生式A→aABe|a修改为
A→aC
C→ABe|ε
对产生式B→Bb|d修改为
B→dB’
B’→bB’|ε
因此得到文法G’[A]:
求出每一个非终结符号的FIRST集和FOLLOW集:
FIRST(A)={a}FOLLOW(A)=FIRST(Be)\{ε}∪{#}={#,d}
FIRST(B)={d}FOLLOW(B)=FIRST(e)\{ε}={e}
FIRST(B’)={b,ε}FOLLOW(B’)=FOLLOW(B)={e}
FIRST(C)={a,ε}FOLLOW(C)=FOLLOW(A)={#,d}
可以看出,对产生式B’→bB’|ε有
FIRST(bB’)∩FOLLOW(B’)={b}∩{e}=ø
对产生式C→ABe|ε有
FIRST(ABe)∩FOLLOW(C)={a}∩{#,d}=ø
而文法的其他产生式都只有一个非空的产生式右部,在自上而下的语法分析过程中不会出现回朔。
所以文法G’[A]就是所求的与原文法等价的LL
(1)文法。
(2)构造G’[A]的预测分析表。
分析表M的构造算法为:
①对FIRST(x)中的每一终结符号a,置M[U,a]=“U→x”;
②如果ε∈FIRST(x),则对于属于FOLLOW(U)的每一个终结符号b或#,分别置M[U,b]=“U→x”和M[U,#]=“U→x”;
③将M中所有不能按规则①与②构造的元素置出错标志ERROR(用空格表示)。
在应用算法的第二条时要注意,“对于属于FOLLOW(U)的每一个终结符号b或#”是指FOLLOW(U)中含有b或者FOLLOW(U)中含有#时,而不是指对#以及FOLLOW(U)中的b都进行处理。
如果FOLLOW(U)中有#,则置M[U,#]=“U→x”;
如果FOLLOW(U)中无#,则不置M[U,#]=“U→x”。
下面为G‘[A]构造预测分析表。
对产生式A→aC∵FIRST(aC)={a}∴M[A,a]=“A→aC”
对产生式B→dB’∵FIRST(dB)={d}∴M[B,d]=“B→dB’”
对产生式B’→bB’|ε∵FIRST(bB’)={b}∴M[B’,b]=“B’→bB’”
又∵FOLLOW(B’)={#,e}∴M[B’,#]=“B’→ε”,M[B’,e]=“B’→ε”
对产生式C→AB|ε∵FIRST(AB)={a}∴M[C,a]=“C→AB”
∵FOLLOW(C)={#,d}∴M[C,#]=“C→ε”,M[C,d]=“C→ε”
根据LL
(1)分析表的构造算法得到:
LL
(1)分析表如表5.5所示。
表5.5文法G’[A]的预测分析表
d
e
A→aC
B→dB’
B’→bB’
B’→ε
C→AB
C→ε
下面给出对输入串aade#的分析过程,如表5.6所示。
表5.6对符号串aade#的分析过程
步骤
aade#
#Ca
#C
ade#
C→ABe
#eBA
#eBCa
#eBC
de#
#eB
B→