编译原理分知识点习题自上而下语法分析 1Word下载.docx

上传人:b****6 文档编号:20607826 上传时间:2023-01-24 格式:DOCX 页数:16 大小:22.89KB
下载 相关 举报
编译原理分知识点习题自上而下语法分析 1Word下载.docx_第1页
第1页 / 共16页
编译原理分知识点习题自上而下语法分析 1Word下载.docx_第2页
第2页 / 共16页
编译原理分知识点习题自上而下语法分析 1Word下载.docx_第3页
第3页 / 共16页
编译原理分知识点习题自上而下语法分析 1Word下载.docx_第4页
第4页 / 共16页
编译原理分知识点习题自上而下语法分析 1Word下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

编译原理分知识点习题自上而下语法分析 1Word下载.docx

《编译原理分知识点习题自上而下语法分析 1Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理分知识点习题自上而下语法分析 1Word下载.docx(16页珍藏版)》请在冰豆网上搜索。

编译原理分知识点习题自上而下语法分析 1Word下载.docx

约定输入符号串以“#”作为输入结束符。

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→

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1