编译原理分知识点习题 自上而下语法分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.设有文法G[S]:

S→AB

A→bB|Aa

B→Sb|a

试消除该文法的左递归。

解:本题考查消除左递归的方法。

应用消除文法左递归的算法对文法G[S]消除左递归的过程如下:

(1)将非终结符排序为:U1=S,U2=A,U3=B

(2)进入算法排序:

i=1时,对文法无影响

i=2,j=1时:A→Aa有直接左递归,消去该直接左递归,得

A→bBA’

A’→aA’|ε

i=3,j=1时:改写文法,有

B→ABb|a

j=2时:改写文法,有

B→bBA’Bb|a无左递归。

(3)所以文法G[S]消除左递归后变为:

G’[S]:S→AB

A→bBA’

A’→aA’|ε

B→bBA’Bb|a

2.设有文法G[E]:

E→Aa|Bb

A→cA|eB

B→bd

试按照递归子程序法为该文法构造语法分析程序。

解:本题考查递归子程序的构造方法。

首先判断文法是否满足递归子程序法对文法的要求,然后再构造递归子程序。

因为:

(1)该文法无左递归。

(2)文法的产生式E→Aa|Bb和A→cA|eB的右部有若干选项,判断这两条产生式右部各候选式的终结首符号集合是否两两互不相交。

对产生式E→Aa|Bb,有

FIRST(Aa)∩FIRST(Bb)={c,e}∩{b}=ø

对产生式A→cA|eB,有

FIRST(cA)∩FIRST(eB)={c}∩{e}=ø

文法中其他产生式都只有一个非空ε的右部。

综合(1)、(2),该文法可以采用自上而下分析方法进行语法分析而不会出现回朔和无限循环。

下面为该文法的每一个非终结符号构造递归子程序。

假设用READAWORD代表读下一个单词。用P(E)、P(A)、P(B)分别表示非

终结符号E、A、B对应的子程序名。约定输入符号串以“#”作为输入结束符。

P(E)的递归子程序为:

PROCEDURE P(E);

BEGIN

IF WORD IN FIRST(Aa)

THEN

BEGIN

P(A);

READAWORD;

IF WORD=’a’

THEN READAWORD

ELSE ERROR

END

ELSE IF WORD IN FIRST(Bb)

THEN

BEGIN

P(B);

READAWORD;

IF WORD=’b’

THEN READAWORD

ELSE ERROR

END

ELSE ERROR

END;

P(A)的递归子程序为:

PROCEDURE P(A);

BEGIN

IF WORDD=’c’

THEN

BEGIN

READAWORD;

P(A)

END

ELSE IF WORD=’e’

THEN

BEGIN

READWORD;

P(B)

END

ELSE ERROR

END;

P(B)的递归子程序为:

PROCEDURE P(B);

BEGIN

IF WORD=’b’

THEN

BEGIN

READAWORD;

IF WORD=’d’

THEN READAWORD

ELSE ERROR

END

ELSE ERROR

END;

主程序中的主要内容为:

READAWORD;

P(E);

IF WORD=”#”

THEN WRITE(“RIGHT!”)

ELSE WRITE(“ERROR!”)

3.已知文法G[E]:

G[E]:E→E+T|T

T→T*F|F

F→i|(E)

请按递归子程序法为其构造语法分析程序。

解:本题考查递归子程序的构造方法。

本题所给文法存在左递归,不满足递归子程序法对文法的要求,必须首先消除文法左递归,然后再构造分析程序。

因为文法只有左递归,采用扩充的BNF范式消除文法左递归得到:G[E]:E→T{+T}

T→F{*F}

F→i|(E)

然后再应用书中介绍的方法即可求解。

假定用“ADV ANCE;”表示对读取下一个单词的过程的调用。

相应的递归子程序为:

PROCEDURE P(E);

BEGIN

P(T);

WHILE SYM=’+’DO

BEGIN

ADV ANCE;

P(T)

END

END;

PROCEDURE P(T);

BEGIN

P(F);

WHILE SYM=’*’DO

BEGIN

ADV ANCE;

P(F)

END

END;

PROCEDURE P(F);

BEGIN

IF SYM=’i’THEN ADV ANCE

ELSE IF SYM=’(’THEN

BEGIN

ADV ANCE;

P(E);

IF SYM=’)’THEN ADV ANCE

ELSE ERROR

END

ELSE ERROR

END;

主程序中的主要内容为:

ADV ANCE;

P(E);

IF WORD=”#”

THEN WRITE(“RIGHT!”)

ELSE WRITE(“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)文法。

相关文档
最新文档