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
第第 55 章章自顶向下语法分析方法自顶向下语法分析方法
第第 55 章章自顶向下语法分析方法自顶向下语法分析方法
语法分析分为:自底向上语法分析 自顶向下语法分析
自顶向下方法:从文法的初始符出发导出句型。
5.1 确定的自顶向下分析思想
例: G(S): S→ABc A→aB|a B→Ab|b判别 aabc 是否为文法 G的句子
S
A B c
a
a A b
SABc AAbc Aabc aabc
首符集、后继符集及选择符集 定义 5.1first(α)= { t|α t…,t∈VT }follow(A)= { t|Z …Att∈VT }select(A→)=
first(α), 当 α不可空 first(α)∪follow(A), 否则其中α∈(VN∪VT)*,A∈VN, first
(ε)={ },α 可空表示α ε 。
**
*
例子:求 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}
求 first(X) 的算法 :(X∈VN∪VT)
若 X∈VT ,则 first(X)= { X}。
若 X∈VN ,且有产生式 X→t… ,则把 t加入到 first(X) 中;若 X→ 也是产生式 ,则把也加入到 first(X)中。其中 t∈VT 。
若有产生式 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) 中。
例 1: X→ABC A→a B→b C→c解: ABCaBC,abC,abc,AbC, Abc,aBc,ABc……
first(X)=first(ABC) ={ a}
例 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 }
例 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 }
例 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,ε }
例 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 }
求 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(α) 。
例子: X→ABC A→a| B→b| C→c|解: first(ABC) =first(A) ~ {ε}∪first(B) ~{ε}∪first(C) = { a,b,c,ε }
求 follow(B) 的算法 :(B∈VN) 对文法初始符 S,令 #∈follow(S) 若 A→xBy 是一个产生式 ,则令 first(y) ~ ε follow(B) 若 A→xB 是一个产生式 ,或 A→xBy是一个产生式且有 ε∈first(y), 则令follow(A) follow(B)
例 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)={#}
例 2 G[X]:X→ABC A→a|aAa B→b C→c|ε则: first(C)={c, ε} follow(B)=first(C) ~ {ε}∪ follow(X) ={c}U{#}={c, #}
求 select(A→α) 的算法 求 first(α) 。
否则求 follow(A) 并令 Select(A→α) =first(α)∪follow(A) 。
若 ε∈first(α), 则令 Select (A→α)=first(α) 。
-
例子 : 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}
例子 : 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,#}
例子 : 考虑文法 ,分别求 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')= { *,ε }
follow(E)={) , #}follow(E')= follow(E)= { ),# }follow(T)=first(E')∪follow(E) = { +, }∪{ ),# } ={+,),#}follow(T')=follow(T)= { +,),# }follow(F)= first(T')∪follow(T) = { *,}∪{ +,),# } ={*,+,),#}
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))= { (}
自顶向下语法的弊端自顶向下的语法分析方法具有一些
弊端:① 产生回溯问题:在语法树上不
知选择那条分支。② 会造成无限循环。
5.4 不确定的自顶向下分析思想
求 :select(A→aB)={a} select(A→a)={a} select(A→aB)∩select(A→a)={a}结论:产生回溯问题
S
A B c
aA ba B
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
总结: 当有两个产生式 A→xi A→xj
并且有Select(xi)∩ Select(xj)≠Ф
必然会产生回溯问题或会造成无限循环。
5.5.1 递归下降法例: G(E): E→eBaA A→a|bAcB B→dEd|aC C→e|dc该文法不含左递归和回溯。
编写自顶向下分析程序,其情况如下:
5.5 确定的自顶向下分析方法
P(E)入口
Ch=e?
error
=
read
P(B)
Ch=a?
error
=
P(A) 出口
E→eBaA
P(A)入口
Ch=a? =
read
Ch=b?
error
=
read P(A)
Ch=c?
error
=
readP(B) 出口
A→a|bAcB
5.5.2 预测分析方法( LL(1) 方法) 引入 LL(1) 文法 :
使用递归子程序方法有限制 ,即对任一非终极符 B进行如下操作: 不含左递归 ( 否则 ,会出现重复调用 )select(B,βi)∩select(B,βj)=Ф (i≠j)
(否则 ,不知选哪个分支 )
定义 3.12 LL(1) 文法:如果对任一非终极符 B都有select(B,βi)∩select(B,βj)=Ф,(i≠j) 。
LL(1) 的含义 : 第 1个 L表明自顶向下分析是从左到右扫描字符串,第 2个 L表明分析过程中将用最左推导, 1表明只需向右看一个符号便可决定如何推导即选择那个产生式进行推导。
有四种动作 :替换 :当 X1∈VN 时 ,选相应侯选式β去替换 X1 。匹配 : 当 X1∈VT 时 ,与 Y1匹配 , 如成功则去掉 X1 和 Y1, 否则报错接受 : 当格局为 (空 ,空 )时 ,分析成功报错 : 不为 (空 ,空 )时。
设有文法: 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)
格局的控制过程由以下条件确定:栈顶元素 (符号栈或分析栈或语法
栈 )输入流第一个符号 (终极符 ,#)
格局的控制过程由 LL矩阵来表示: LL[Xi,Yj]=ACTij 其中: Xi∈(VN∪VT∪{#}
Yj∈(VT∪{#} ) ACTij 表示动作序列
预测分析方法是自顶向下分析的另一种方法,一个预测分析器是由三部分组成: 预测分析程序 先进后出栈 预测分析表
被分析的串 ω写成 ω# ,并首先往分析栈中放进符号 #,为了描述 ACTij, 引入下面三个过程: NEXT:删除输入流的第一个字符 PROCESS: 不删除输入流的第一个字符 REPL(β): 用 β 的逆串代替栈顶元素
~
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)
~
~
其中 select(B→Aω)= { a1,a2,…an } Ⅲ. 对 #令 :LL[#,#]=ok Ⅳ. 对其他情形令 :LL[X,a]=ERR(k)
处理 P, N,R操作:① 当遇到小写字母时进行 N操作,
删除小写字母。② 当遇到大写字母时进行 P操作,
保留源大写字母。③ 将符号串进行逆序转换。
例子: G(E): E→E+E E→E*E E→(E)|i 1.构造 LL矩阵 2. 符号串 i+i*i 的 LL 分析过程
解:首先此文法有二义性应该去除。 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
各产生式的 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))= { (}
表达式文法的预测分析表
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’→
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矩阵
E#
TE’#
T#
分析过程:E→TE’ T→+FT’ F→(E)
F T’#
F#
E)#
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