45
5 5 第第第第第第第第第第 第第第第第第第第第第

第 5 章 自顶向下语法分析方法

  • Upload
    jasia

  • View
    139

  • Download
    0

Embed Size (px)

DESCRIPTION

第 5 章 自顶向下语法分析方法. 5.1 确定的自顶向下分析思想. 语法分析分为:自底向上语法分析 自顶向下语法分析 自顶向下方法 :从文法的初始符出发导出句型。. S. B. A. c. a. b. A. a. 例: G(S): S→ABc A→aB|a B→Ab|b 判别 aabc 是否为文法 G 的句子. S  ABc  AAbc  Aabc  aabc. 首符集、后继符集及选择符集 定义 5.1 - PowerPoint PPT Presentation

Citation preview

Page 1: 第 5 章 自顶向下语法分析方法

第第 55 章章自顶向下语法分析方法自顶向下语法分析方法

第第 55 章章自顶向下语法分析方法自顶向下语法分析方法

Page 2: 第 5 章 自顶向下语法分析方法

语法分析分为:自底向上语法分析 自顶向下语法分析

自顶向下方法:从文法的初始符出发导出句型。

5.1 确定的自顶向下分析思想

Page 3: 第 5 章 自顶向下语法分析方法

例: G(S): S→ABc A→aB|a B→Ab|b判别 aabc 是否为文法 G的句子

S

A B c

a

a A b

SABc AAbc Aabc aabc

Page 4: 第 5 章 自顶向下语法分析方法

首符集、后继符集及选择符集 定义 5.1first(α)= { t|α t…,t∈VT }follow(A)= { t|Z …Att∈VT }select(A→)=

first(α), 当 α不可空 first(α)∪follow(A), 否则其中α∈(VN∪VT)*,A∈VN, first

(ε)={ },α 可空表示α ε 。

**

*

Page 5: 第 5 章 自顶向下语法分析方法

例子:求 first(X) 其中 X→aBc

first(X)= { a}求 follow(B) 其中 X→aBc

follow(B)= { c}求 select(A→aBc) 其中 X→aBc select(A→aBc)= first(X)= { a}

Page 6: 第 5 章 自顶向下语法分析方法

求 first(X) 的算法 :(X∈VN∪VT)

若 X∈VT ,则 first(X)= { X}。

若 X∈VN ,且有产生式 X→t… ,则把 t加入到 first(X) 中;若 X→ 也是产生式 ,则把也加入到 first(X)中。其中 t∈VT 。

Page 7: 第 5 章 自顶向下语法分析方法

若有产生式 X→Y……,(Y∈VN), 则把 first(Y) ~ {ε} 中的元素全部加到first(X) 中;若 X→Y1Y2…Yn 是一产生式 ,同时 Y1,…,Yi-1 是非终极符 ,且对一切 j=1,2,…,i-1, 都有 first (Yj), 则把 first(Yi) ~ {ε} 的元素全部加到 first(X) 中;特别是对一切 j=1,2,…,n, 都有 first(Yj) 时 ,要把加 first(X) 中。

Page 8: 第 5 章 自顶向下语法分析方法

例 1: X→ABC A→a B→b C→c解: ABCaBC,abC,abc,AbC, Abc,aBc,ABc……

first(X)=first(ABC) ={ a}

Page 9: 第 5 章 自顶向下语法分析方法

例 2: X→ABC

A→a| B→b C→c解: ABCaBC,abC,abc,AbC,Abc, aBc,ABc,bC,bc,BC,Bc……

first(X)=first(ABC)= { a,b }

Page 10: 第 5 章 自顶向下语法分析方法

例 3: X→ABC

A→a| B→b| C→c解: ABCaBC,abC,abc,AbC,Abc,aBc, ABc,bC,bc,BC,Bc,c,C…… first(X)=first(ABC) = { a,b,c }

Page 11: 第 5 章 自顶向下语法分析方法

例 4: X→ABC

A→a| B→b| C→c|解: ABCaBC,abC,abc,AbC,Abc,aBc, ABc,bC,bc,BC,Bc,c,C,ε…… first(X)=first(ABC) = { a,b,c,ε }

Page 12: 第 5 章 自顶向下语法分析方法

例 5: X→ABc

A→a|b| B→c|d D→d解: first(X)=first(ABc) =first(A)∪first(B) = { a,b }∪{ c,d } = { a,b,c,d }

Page 13: 第 5 章 自顶向下语法分析方法

求 first() 的算法 :(α=X1X2…Xn)

若 n=0, 即 =ε, 则令 first()={ε} 否则 ,对 1≤i≤n, 求 first(Xi) 。 若 n≥2, 且对一切 j=1,2,…,i-1 都有 ε∈first(Xj), 则令 first(Xi) ~{ε} first(), 其中 2≤i≤n。若对一切 j=1,2,…,n 都有 ε∈first (Xj),则令 ε∈first(α) 。

Page 14: 第 5 章 自顶向下语法分析方法

例子: X→ABC A→a| B→b| C→c|解: first(ABC) =first(A) ~ {ε}∪first(B) ~{ε}∪first(C) = { a,b,c,ε }

Page 15: 第 5 章 自顶向下语法分析方法

求 follow(B) 的算法 :(B∈VN) 对文法初始符 S,令 #∈follow(S) 若 A→xBy 是一个产生式 ,则令 first(y) ~ ε follow(B) 若 A→xB 是一个产生式 ,或 A→xBy是一个产生式且有 ε∈first(y), 则令follow(A) follow(B)

Page 16: 第 5 章 自顶向下语法分析方法

例 1 G[X]:X→AB A→a|aAa B→b则: follow(X)={#}因为 A→aAa 所以 {a} follow(A) follow(A)=first(B)∪{a} ={b}∪{a}={b,a}   follow(B)=follow(X)={#}

Page 17: 第 5 章 自顶向下语法分析方法

例 2 G[X]:X→ABC A→a|aAa B→b C→c|ε则: first(C)={c, ε} follow(B)=first(C) ~ {ε}∪ follow(X) ={c}U{#}={c, #}

Page 18: 第 5 章 自顶向下语法分析方法

求 select(A→α) 的算法 求 first(α) 。

否则求 follow(A) 并令 Select(A→α) =first(α)∪follow(A) 。

若 ε∈first(α), 则令 Select (A→α)=first(α) 。

-

Page 19: 第 5 章 自顶向下语法分析方法

例子 : G[Z]: Z→aA A→b

first(Z)={a}first(A)={b}follow(Z)={#}follow(A)= follow(Z)={#}select(Z→aA)={a}select(A→b)={b}

Page 20: 第 5 章 自顶向下语法分析方法

例子 : G[Z]: Z→AB A→a|ε B→b|ε

first(AB)={a,b,ε}Follow(Z)={#}select(Z→AB)

=first(AB) ~ {ε}∪follow(Z) ={a,b}∪{#} ={a,b,#}

Page 21: 第 5 章 自顶向下语法分析方法

例子 : 考虑文法 ,分别求 first,follow , select 集 G[E]:E→TE' E'→+TE'|ε T→FT' T'→*FT'|ε F→i|(E)first(E)=first(T)=first(F)={i,( }first(E‘)= { +,ε }first(T')= { *,ε }

Page 22: 第 5 章 自顶向下语法分析方法

follow(E)={) , #}follow(E')= follow(E)= { ),# }follow(T)=first(E')∪follow(E) = { +, }∪{ ),# } ={+,),#}follow(T')=follow(T)= { +,),# }follow(F)= first(T')∪follow(T) = { *,}∪{ +,),# } ={*,+,),#}

Page 23: 第 5 章 自顶向下语法分析方法

select(E→TE')=first(T)= { i,( }select(E'→+TE')= { +}select(E‘→ε)=follow(E’)= { ),# }select(T→FT')=first(F)= { ),# }select(T'→*FT')= { *}select(T'→ε)=follow(T') = { +,),# }select(F→i)= { i}select(F→(E))= { (}

Page 24: 第 5 章 自顶向下语法分析方法

自顶向下语法的弊端自顶向下的语法分析方法具有一些

弊端:① 产生回溯问题:在语法树上不

知选择那条分支。② 会造成无限循环。

5.4 不确定的自顶向下分析思想

Page 25: 第 5 章 自顶向下语法分析方法

求 :select(A→aB)={a} select(A→a)={a} select(A→aB)∩select(A→a)={a}结论:产生回溯问题

S

A B c

aA ba B

Page 26: 第 5 章 自顶向下语法分析方法

S

A B

b B S B

S b

A B

Select(A→bB)∩select(A→Aa)={b}结论:会造成无限循环

G[S]:S→AB A→bB|Aa B→Sb|a

Page 27: 第 5 章 自顶向下语法分析方法

总结: 当有两个产生式 A→xi A→xj

并且有Select(xi)∩ Select(xj)≠Ф

必然会产生回溯问题或会造成无限循环。

Page 28: 第 5 章 自顶向下语法分析方法

5.5.1 递归下降法例: G(E): E→eBaA A→a|bAcB B→dEd|aC C→e|dc该文法不含左递归和回溯。

编写自顶向下分析程序,其情况如下:

5.5 确定的自顶向下分析方法

Page 29: 第 5 章 自顶向下语法分析方法

P(E)入口

Ch=e?

error

=

read

P(B)

Ch=a?

error

=

P(A) 出口

E→eBaA

Page 30: 第 5 章 自顶向下语法分析方法

P(A)入口

Ch=a? =

read

Ch=b?

error

=

read P(A)

Ch=c?

error

=

readP(B) 出口

A→a|bAcB

Page 31: 第 5 章 自顶向下语法分析方法

5.5.2 预测分析方法( LL(1) 方法) 引入 LL(1) 文法 :

使用递归子程序方法有限制 ,即对任一非终极符 B进行如下操作: 不含左递归 ( 否则 ,会出现重复调用 )select(B,βi)∩select(B,βj)=Ф (i≠j)

(否则 ,不知选哪个分支 )

Page 32: 第 5 章 自顶向下语法分析方法

定义 3.12 LL(1) 文法:如果对任一非终极符 B都有select(B,βi)∩select(B,βj)=Ф,(i≠j) 。

LL(1) 的含义 : 第 1个 L表明自顶向下分析是从左到右扫描字符串,第 2个 L表明分析过程中将用最左推导, 1表明只需向右看一个符号便可决定如何推导即选择那个产生式进行推导。

Page 33: 第 5 章 自顶向下语法分析方法

有四种动作 :替换 :当 X1∈VN 时 ,选相应侯选式β去替换 X1 。匹配 : 当 X1∈VT 时 ,与 Y1匹配 , 如成功则去掉 X1 和 Y1, 否则报错接受 : 当格局为 (空 ,空 )时 ,分析成功报错 : 不为 (空 ,空 )时。

Page 34: 第 5 章 自顶向下语法分析方法

设有文法: G[A]:A→aBc B→d|bB 判别符号串是否文法的句子。 格局的变化过程如下: (A, abbdc)==>(cBa, abbdc) ==>(cB, bbdc) ==> (cBb,bbdc) ==>(cB,bdc) ==>(cBb,bdc) ==>(cB, dc) ==>(cd, dc) ==>(c, c)

Page 35: 第 5 章 自顶向下语法分析方法

格局的控制过程由以下条件确定:栈顶元素 (符号栈或分析栈或语法

栈 )输入流第一个符号 (终极符 ,#)

格局的控制过程由 LL矩阵来表示: LL[Xi,Yj]=ACTij 其中: Xi∈(VN∪VT∪{#}

Yj∈(VT∪{#} ) ACTij 表示动作序列

Page 36: 第 5 章 自顶向下语法分析方法

预测分析方法是自顶向下分析的另一种方法,一个预测分析器是由三部分组成: 预测分析程序 先进后出栈 预测分析表

被分析的串 ω写成 ω# ,并首先往分析栈中放进符号 #,为了描述 ACTij, 引入下面三个过程: NEXT:删除输入流的第一个字符 PROCESS: 不删除输入流的第一个字符 REPL(β): 用 β 的逆串代替栈顶元素

~

Page 37: 第 5 章 自顶向下语法分析方法

LL矩阵的构造算法 : 对每一 B→ω, 求 select(B→ω) Ⅰ. 对每一个 a∈VT,a 不现于侯选式的首位 , 令 LL[a,a]=(REPL(ε),NEXT) Ⅱ. 对每一个 B∈VN a. 若有 B∈aω(a∈VT), 则令 LL[B,a]=(REPL(ω),NEXT) b. 若有 B→Aω(A∈VN), 则令 LL[B,ai]=(REPL(Aω),PROCESS)

~

~

Page 38: 第 5 章 自顶向下语法分析方法

其中 select(B→Aω)= { a1,a2,…an } Ⅲ. 对 #令 :LL[#,#]=ok Ⅳ. 对其他情形令 :LL[X,a]=ERR(k)

处理 P, N,R操作:① 当遇到小写字母时进行 N操作,

删除小写字母。② 当遇到大写字母时进行 P操作,

保留源大写字母。③ 将符号串进行逆序转换。

Page 39: 第 5 章 自顶向下语法分析方法

例子: G(E): E→E+E E→E*E E→(E)|i 1.构造 LL矩阵 2. 符号串 i+i*i 的 LL 分析过程

Page 40: 第 5 章 自顶向下语法分析方法

解:首先此文法有二义性应该去除。 G(E): E→E+T|T T→T*E|F F→(E)|i 其次此文法有左递归应该去除。 G(E): E→TE’ E’→+TE’| T→FT’ T’→*FT’| F→(E)|i

Page 41: 第 5 章 自顶向下语法分析方法

各产生式的 SELECT 集合为:select(E→TE')=first(T)= { i,( }select(E'→+TE')= { +}select(E'→ε)=follow(E')= { ),# }select(T→FT')=first(F)= { ),# }select(T'→*FT')= { *}select(T'→ε)=follow(T')= { +,),# }select(F→i)= { i}select(F→(E))= { (}

Page 42: 第 5 章 自顶向下语法分析方法

表达式文法的预测分析表

F→(E)F→iF

T’→*FT’T’→T’

T→FT’T

E’→E’→+TE’E’

E→TE’E

#)(*+i

E→TE’

E’→

T→FT’

T’→ T’→

Page 43: 第 5 章 自顶向下语法分析方法

OK#

ε,P)

)E,Nε,NF

ε,Pε,PT’F,Nε,PT’

T’F,PT’F,PT

ε,Pε,PE’T,NE’

E’T,PE’T,PE

i + * ( ) #表达式文法的 LL矩阵

Page 44: 第 5 章 自顶向下语法分析方法

E#

TE’#

T#

分析过程:E→TE’ T→+FT’ F→(E)

F T’#

F#

E)#

Page 45: 第 5 章 自顶向下语法分析方法

LL[E',#]=(ε,P) ##E'

LL[#,#]=Ok # #

LL[T',#]=(ε,P) # #E'T'

LL[F,i]=(ε,N) i# #E'T'F

LL[T',*]=(T'F,N) *i# #E'T'

LL[F,i]=(ε,N) i*i# #E'T'F

LL[T,i]=(T'F,P) i*i# #E'T

LL[E',+]=(E'T,N) +i*i# #E'

LL[T',+]=(ε,P) +i*i# #E'T'

LL[F,i]=(ε,N) i+i*i# #E'T'F

LL[T,i]=(T'F,P) i+i*i# #E'T

LL[E,i]=(E'T,P) i+i*i# #E

矩阵元素 输入流 T 分析栈 S