1 / 51

# 第5章 自顶向下语法分析方法 - PowerPoint PPT Presentation

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

## PowerPoint Slideshow about '第5章 自顶向下语法分析方法' - blake-greer

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

LL(1)文法的判别

S

S

S

S

p

A

p

A

p

A

p

A

c

A

d

c

A

d

c

A

d

c

A

d

c

A

d

a

W=ccap自顶向下的推导过程：

S  Ap  cAp  ccAp  ccap

S

S

S

S

A

p

A

p

A

p

A

p

c

A

c

A

c

A

c

A

c

A

a

• 文法G1[S]:S→ApS→BqA→aA→cAB→bB→dB

*

*

FIRST(Ap)={a,c}

FIRST(Bq)={b,d}

• 文法G2[S]:S→ApS→BqA→aA→cAB→bB→dB

W=abd试图推导的过程：

S  aA  abAS  abS  abd

#作为输入串的结束符，或称为句子括号，如：#输入串#

*

*

*

*

*

*

*

1表示：只需向右看一个符号便可决定如何推导（即选择哪个产生式进行推导）。

LL(1)文法的含义：

SELECT(S→aA) ={a}SELECT(S→d) ={d}SELECT(A→bAS) ={b}SELECT(A→ε) ={a,d,#,ε}

SELECT(S→aA) ∩ SELECT(S→d)={a}∩{d}=ΦSELECT(A→bAS)∩SELECT(A→ε)={b}∩{a,d,#, ε}=Φ

SELECT(S→aAS) ={a}SELECT(S→b) ={b}SELECT(A→bA) ={b}SELECT(A→ε) ={a,b,ε}

SELECT(S→aAS) ∩ SELECT(S→b)={a}∩{b}=ΦSELECT(A→bA)∩SELECT(A→ε)={b}∩{a,b,ε}≠Φ

G[S]:S→aASS→bA→bAA→ε

S  aAS  abAS  abS 出错

S  aAS  aS  ab

LL(1)文法的判别

1.若XV,则FIRST(X)={X}

2.若XVN,且有产生式Xa…，则a∈FIRST(X);若X也是一条产生式,则∈FIRST(X).

3.若XY…是一个产生式且YVN,则把FIRST(Y)中的所有非元素都加到FIRST(X)中;若X  Y1Y2…YK是一个产生式,Y1,Y2,…,Y(i-1)都是非终结符,而且,对于任何j,1≤j ≤i-1,FIRST(Yj)都含有(即Y1..Y(i-1) ),则把FIRST(Yj)中的所有非元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj ,j=1,2,…,K)均含有,则把加到FRIST(X)中.

2.计算FIRST集

*

FIRST(S)=(FIRST(A)-{ε})∪FIRST(B)-{ε})∪{ε}∪{b}={a,b,ε}

FIRST(A)={b, ε}

FIRST(B)={a, ε}

FIRST(C)={a,b,c}

FIRST(D)={a,c}

FIRST(AB)={a,b,ε}

1.对于文法的开始符号S,置#于FOLLOW(S)。;

2.若Ａ→αBβ是一个产生式,则把  FIRST(β)\{}加至FOLLOW(B)中;

3.若Ａ→αB是一个产生式,或Ａ→αBβ是  一个产生式而β(即FIRST(β)），则把FOLLOW（A），加至FOLLOW（B）中．

3.计算FOLLOW集

*

FOLLOW(S)={#}∪FOLLOW(D)

FOLLOW(A)={a}∪{a,c}∪FOLLOW(S)

FOLLOW(B)=FOLLOW(S)

FOLLOW(C)=FOLLOW(S)

FOLLOW(D)=FOLLOW(B)∪FOLLOW(C)

FOLLOW(S)= {#}

FOLLOW(A)= {a,c,#}

FOLLOW(B)= {#}

FOLLOW(C)= {#}

FOLLOW(D)= {#}

FIRST(S)={a,b,ε}

FIRST(A)={b, ε}

FIRST(B)={a, ε}

FIRST(C)={a,b,c}

FIRST(D)={a,c}

FIRST(AB)={a,b,ε}

SELECT(S→AB)={a,b,ε,#}

SELECT(S→bC)={b}

SELECT(A→ε)={a,c,#,ε}

SELECT(A→b)={b}

SELECT(B→ε)={#,ε}

SELECT(C→b)={b}

SELECT(D→aS)={a}

SELECT(D→c)={c}

FOLLOW(S)= {#}

FOLLOW(A)= {a,c,#}

FOLLOW(B)= {#}

FOLLOW(C)= {#}

FOLLOW(D)= {#}

A→αβ|αγ导致SELECT(A→αβ)∩ SELECT(A→αγ)≠Φ，因此非LL(1)文法。

A→αβ1|αβ2|…|αβn 变换为A→α(β1|β2|…|βn)，然后：A→αA'A' → β1|β2|…|βn

A→b

A→ε

S→ε

w=aabb

S=>aSA =>aaSAA =>aaAA =>aabA (aaA)

2.化为：

A→a(d|Ac)

A→bBc

B→aAB→bB

3.化为：

A→aA'

A→bBc

A'→d

A'→Ac

B→aAB→bB

A→aAc

A→bBc

B→aAB→bB

3.化为：

S→aSA'

S→bc

A'→d

A'→c

A→aSA→b

1.化为：S→aSdS→aSc

S→bc

A→aSA→b

2.化为：

S→aS(d|c)S→bc

A→aSA→b

3.化为：

S→aS'

S→dq|eq

S'→App|BqqA→aAp|dB→aBq|e

1.化为：S→aApp|aBqq|dq|eqA→aAp|dB→aBq|e

4.化为：

S→aS'

S→dq|eq

S'→ aAppp|aBqqq|dpp|eqqA→aAp|dB→aBq|e

2.化为：

S→a(App|Bqq)S→dq|eq

A→aAp|dB→aBq|e

A→Aα1| Aα2|…| Aαm|β1|β2|…|βn其中： αi 不等于ε ， βj不以A开头。 改为：

A→ β1A'| β2A' |…| βnA' A'→ α1A' | α2A' |…| αmA' |ε

B→aBcB→BbcB→d

B→aBcB' | dB' B'→bcB'| ε

1.无回路(A(A (A) 2.无空产生式

（1） 以某种顺序将文法非终结符排列A1 ,A2 …An

（2） for i:=1 to n do

begin

for j:=1 to i-1 do

Aj--> 1| 2…| k是关于Aj的全部产生式;

end;

（3）化简由2得到的文法

+

R→ Qca|ca|a

R→ Rbca|bca|ca|a

R→ (bca|ca|a)R'

R' → bcaR'|ε

1.由于相同左部的产生式的右部FIRST集交集不为空引起回溯。1.由于相同左部的产生式的右部FIRST集交集不为空引起回溯。

A→ab|a

w=xay

S

S

S

x A y

x A y

x A y

a

a b

2.由于相同左部非终结符的右部能 ε 且该非终结符FOLLOW集中含有其右部FIRST集的元素。

*

w=ab#

S

S

S

a A S

a A S

a A S

ε

b

b A S

3.由于文法含有左递归而引起回溯。

w=baa#

S

S

S

S

S

S a

S a

S a

S a

b

S a

S a

b

b

1.递归子程序法

2.预测分析法

E →E+T | T

T →T*F | F

F → i | ( E )

1.判断文法是否为LL(1)文法

E →TE'E' → +TE' | ε

T →FT'T' → *FT' | ε

F → i | ( E )

E →E+T | T

T →T*F | F

F → i | ( E )

E →TE'E' → +TE' | ε

T →FT'T' → *FT' | ε

F → i | ( E )

FIRST(E)={ ( , i }

FIRST(E')={ + , ε }

FIRST(T)={ ( , i }

FIRST(T')={ * , ε }

FIRST(F)={ ( , i }

FOLLOW(E)={ ) , # }

FOLLOW(E')={ ) , # }

FOLLOW(T)={ + , ) , # }

FOLLOW(T')={ + , ) , # }

FOLLOW(F)={ * , + , ) , # }

E →TE'E' → +TE' | ε

T →FT'T' → *FT' | ε

F → i | ( E )

SELECT(E →TE') ={( , i}

SELECT(E' → +TE' ) ={+}

SELECT(E' → ε) ={ε, ) , #}

SELECT(T →FT') ={( , i }

SELECT(T' → *FT' ) ={*}

SELECT(T' → ε) ={ε, + , ) , #}

SELECT(F → ( E )) ={(}

SELECT(F → i) ={ i}

FOLLOW(E)={ ) , # }

FOLLOW(E')={ ) , # }

FOLLOW(T)={ + , ) , # }

FOLLOW(T')={ + , ) , # }

FOLLOW(F)={ * , + , ) , # }

E →TE'E' → +TE' | ε

T →FT'T' → *FT' | ε

F → i | ( E )

FIRST(E)={ ( , i }

FIRST(E')={ + , ε }

FIRST(T)={ ( , i }

FIRST(T')={ * , ε }

FIRST(F)={ ( , i }

SELECT(E →TE') ={( , i}

SELECT(E' → +TE' ) ={+}

SELECT(E' → ε) ={ε, ) , #}

SELECT(T →FT') ={( , i }

SELECT(T' → *FT' ) ={*}

SELECT(T' → ε) ={ε, + , ) , #}

SELECT(F → ( E )) ={(}

SELECT(F → i) ={ i}

2.构造预测分析表

#E

#E'T

#E'T'F

#E'T'i

#E'T'

#E'

#E'T+

#E'T

#E'T'F

#E'T'i

#E'T'

#E'T'F*

#E'T'F

#E'T'i

#E'T'

#E'

#

i+i*i#

i+i*i#

i+i*i#

i+i*i#

+i*i#

+i*i#

+i*i#

i*i#

i*i#

i*i#

*i#

*i#

i#

i#

#

#

#

E→TE'

T→FT'

F → i

i 匹配

T' → ε

E' → +TE'

+ 匹配

T →FT'

F → i

i 匹配

T → *FT'

* 匹配

F → i

i 匹配

T' → ε

E' → ε