自顶向下语法分析之First集,Follow集,Predict集(自创标记法,利于手工计算)

本文详细介绍了如何计算文法中的First集、Follow集和Predict集,通过实例演示了如何求解并消除公共前缀和左递归,以满足LL(1)文法分析条件。关键步骤包括观察产生式、更新Follow集以及构建Predict集的公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础:三个重要集合

First集

F i r s t ( β ) First(\beta ) First(β)对象是串 β \beta β,是 β \beta β串所有可能首字母(非终极符)组成的集合,包括 ε \varepsilon ε

Follow集

F o l l o w ( A ) Follow(A) Follow(A)对象是非终极符 A A A,是 A A A之后的下一个字母(非终极符)的集合,没有 ε \varepsilon ε,有#表示终止符。

Predict集

P r e d i c t ( A → β ) Predict(A\to \beta ) Predict(Aβ)对象是产生式 A → β A \to \beta Aβ,如果产生式不可能为空串,则等于 F i r s t ( β ) First(\beta ) First(β),否则,这个集合包括 F i r s t ( β ) First(\beta ) First(β)的非空部分和 F o l l o w ( A ) Follow(A) Follow(A)的并。

求解方法
  • 对于 F i r s t First First集,在以求 P r e d i c Predic Predict集为目的的情况下,一般是对每一个非终极符 A A A求其 F i r s t First First集,而不是对于每条产生式右部。方法以观察为主,注意的是优先去求产生式右部首字母是终极符的那些非终极符的 F i r s t First First集,再去求产生式右部首字母是非终极符的 F i r s t First First集,这样不容易出错。
  • 对于 F o l l o w Follow Follow集,也是最重要的部分,个人使用算法如下:
    1. 初始化:对于每个非终极符,初始化 S = { # } S=\left \{ \# \right \} S={#},其余非终极符为空集。
    2. 按顺序遍历每条产生式,按顺序遍历该产生式右部的每个非终极符(一个双重循环,如果产生式右部没有非终极符,或者为空,不做任何操作):
      • 如果在产生式右部的串中,该非终极符右部已经没有东西了( A → α B A\to \alpha B AαB),则建立关系: F o l l o w ( A ) ⊆ F o l l o w ( B ) Follow(A)\subseteq Follow(B) Follow(A)Follow(B),把A标记在B的集合上: B = A { . . . } B = _{A}\left \{ ... \right \} B=A{...},此后每当 F o l l o w ( A ) Follow(A) Follow(A)扩充时,同时也对含有其下标的 F o l l o w ( B ) Follow(B) Follow(B)扩充。
      • 如果在产生式右部的串中,该非终极符右部是一个终极符,直接将该终极符扩充入该非终极符的 F o l l o w Follow Follow集中。
      • 如果在产生式右部的串中,该非终极符B右部是一个非终极符C,如果 F i r s t ( C ) First(C) First(C)不含 ε \varepsilon ε,将 F i r s t ( C ) First(C) First(C)扩充入 F o l l o w ( B ) Follow(B) Follow(B)中,否则,将 F i r s t ( C ) First(C) First(C)中除去 ε \varepsilon ε的其他所有元素扩充入 F i r s t ( C ) First(C) First(C)中,然后观察 C C C之后的串,所有可能出现的第一个非终极符,采用与所述三条中类似的策略。
  • 注意:求 F o l l o w Follow Follow集的易错之处在于对 F o l l o w ( A ) ⊆ F o l l o w ( B ) Follow(A)\subseteq Follow(B) Follow(A)Follow(B)关系的更新处理出现的遗漏,以及思路的不清晰,导致对产生式中一些非终极符考虑的遗漏。对于一些易错的点,举几个例子:
    A → B x A\to Bx ABx F o l l o w ( B ) = F o l l o w ( B ) ∪ x Follow(B)=Follow(B)\cup x Follow(B)=Follow(B)x
    A → x B ( ε ∈ F i r s t ( B ) ) : 标 记 B = A { . . . } A\to xB(\varepsilon \in First(B)):标记B = _{A}\left \{ ... \right \} AxB(εFirst(B)):B=A{...}, F o l l o w ( A ) Follow(A) Follow(A)所有元素并入B,且不断更新
    A → B C d ( 对 B 分 析 ) : F o l l o w ( B ) = F i r s t ( C d ) , F i r s t ( C d ) 必 不 为 空 , 故 F o l l o w ( B ) 不 可 能 与 F o l l o w ( A ) 有 关 。 A\to BCd(对B分析): Follow(B)=First(Cd), First(Cd)必不为空,故Follow(B)不可能与Follow(A)有关。 ABCdB:Follow(B)=First(Cd),First(Cd)Follow(B)Follow(A)
  • 对于 P r e d i c t Predict Predict集,直接给出公式: P r e d i c t ( A → β ) = {   F i r s t ( β ) , ε ∉ F i r s t ( β )   { F i r s t ( β ) − { ε } } ∪ F o l l o w ( A ) , ε ∈ F i r s t ( β ) Predict(A\to \beta )=\begin{cases} & \text{ }First(\beta ),\varepsilon \notin First(\beta ) \\ & \text{ } \left \{ First(\beta )-\left \{ \varepsilon \right \} \right \} \cup Follow(A),\varepsilon \in First(\beta ) \end{cases} Predict(Aβ)={ First(β),ε/First(β) {First(β){ε}}Follow(A),εFirst(β)
    实际上就是观察 β \beta β的首字母,如果是终极符,就直接填上结束,否则就要根据之前求的非终极符 F i r s t First First集和 F o l l o w Follow Follow集综合判断。特别的,有 P r e d i c t ( A → ε ) = F o l l o w ( A ) Predict(A\to \varepsilon )=Follow(A) Predict(Aε)=Follow(A)
消除公共前缀和左递归

为了满足LL(1)文法分析条件,需要消除公共前缀和左递归。考试一般只要考虑直接左递归,因此只介绍消除公共前缀和直接左递归。

  • 消除公共前缀: A → a B ∣ a C ∣ a D 变 为 A → a A ′ , A ′ → B ∣ C ∣ D A\to aB|aC|aD变为A\to aA^{'},A^{'}\to B|C|D AaBaCaDAaA,ABCD
  • 消除直接左递归: A → A α ∣ β 变 为 A → β A ′ , A ′ → α A ′ ∣ ε A\to A\alpha |\beta 变为A\to \beta A^{'},A^{'}\to \alpha A^{'}|\varepsilon AAαβAβA,AαAε,注意 ε \varepsilon ε容易遗漏。

例题(2011期末考试真题)

已知文法 G G G:
E → E − T ∣ T T → T ∗ F ∣ F F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &E\to E-T|T\\ &T\to T*F|F\\ &F\to rP|P\\ &P\to (E)|i\\ \end{aligned} EETTTTFFFrPPP(E)i
首先,消除直接左递归:
E → T E ′ E ′ → − T E ′ ∣ ε T → F T ′ T ′ → ∗ F T ′ ∣ ε F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &E\to TE^{'} \\ &{\color{Green} E^{'}\to -TE^{'}|\varepsilon } \\ &T\to FT^{'}\\ &{\color{Green} T^{'}\to *FT^{'}|\varepsilon} \\ &F\to rP|P\\ &{\color{Green} P\to (E)|i} \\ \end{aligned} ETEETEεTFTTFTεFrPPP(E)i

对可以直求的非终极符 P P P, T ′ T^{'} T, E ′ E^{'} E F i r s t First First集:

非终极符FirstFollow
E E E
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε}
T T T
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε}
F F F
P P P { ( , i } \left \{ (,i \right \} {(,i}

F i r s t ( P ) First(P) First(P)已知,可以直求 F i r s t ( F ) First(F) First(F)
E → T E ′ E ′ → − T E ′ ∣ ε T → F T ′ T ′ → ∗ F T ′ ∣ ε F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &E\to TE^{'} \\ &E^{'}\to -TE^{'}|\varepsilon \\ &T\to FT^{'}\\ &T^{'}\to *FT^{'}|\varepsilon \\ &{\color{Green} F\to rP|P} \\ &P\to (E)|i\\ \end{aligned} ETEETEεTFTTFTεFrPPP(E)i

非终极符FirstFollow
E E E
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε}
T T T
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε}
F F F { r , ( , i } \left \{ r,(,i \right \} {r,(,i}
P P P { ( , i } \left \{ (,i \right \} {(,i}

F i r s t ( F ) First(F) First(F)已知,可以求 F i r s t ( T ) First(T) First(T),从而求 F i r s t ( E ) First(E) First(E)
E → T E ′ E ′ → − T E ′ ∣ ε T → F T ′ T ′ → ∗ F T ′ ∣ ε F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &{\color{Orange} E\to TE^{'}} \\ &E^{'}\to -TE^{'}|\varepsilon \\ &{\color{Green} T\to FT^{'}} \\ &T^{'}\to *FT^{'}|\varepsilon \\ &F\to rP|P\\ &P\to (E)|i\\ \end{aligned} ETEETEεTFTTFTεFrPPP(E)i

非终极符FirstFollow
E E E { r , ( , i } \left \{ r,(,i \right \} {r,(,i}
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε}
T T T { r , ( , i } \left \{ r,(,i \right \} {r,(,i}
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε}
F F F { r , ( , i } \left \{ r,(,i \right \} {r,(,i}
P P P { ( , i } \left \{ (,i \right \} {(,i}

初始化 F o l l o w Follow Follow集:

非终极符FirstFollow
E E E { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { # } \left \{ \# \right \} {#}
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε} { } \left \{ \right \} {}
T T T { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { } \left \{ \right \} {}
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε} { } \left \{ \right \} {}
F F F { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { } \left \{ \right \} {}
P P P { ( , i } \left \{ (,i \right \} {(,i} { } \left \{ \right \} {}

对产生式 E → T E ′ E\to TE^{'} ETE,更新 T T T, E ′ E^{'} E:
E → T E ′ E ′ → − T E ′ ∣ ε T → F T ′ T ′ → ∗ F T ′ ∣ ε F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &{\color{Green} E\to TE^{'} } \\ &E^{'}\to -TE^{'}|\varepsilon \\ &T\to FT^{'}\\ &T^{'}\to *FT^{'}|\varepsilon \\ &F\to rP|P\\ &P\to (E)|i\\ \end{aligned} ETEETEεTFTTFTεFrPPP(E)i

非终极符FirstFollow
E E E { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { # } \left \{ \# \right \} {#}
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε} E { # } _{E}^{} \left \{ \# \right \} E{#}
T T T { r , ( , i } \left \{ r,(,i \right \} {r,(,i} E ′ { − , # } _{E^{'}}^{} \left \{ -,\# \right \} E{,#}
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε} { } \left \{ \right \} {}
F F F { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { } \left \{ \right \} {}
P P P { ( , i } \left \{ (,i \right \} {(,i} { } \left \{ \right \} {}

对产生式 E → − T E ′ E\to -TE^{'} ETE,更新 T , E ′ T,E^{'} T,E:(没有发生变化)
E → T E ′ E ′ → − T E ′ ∣ ε T → F T ′ T ′ → ∗ F T ′ ∣ ε F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &E\to TE^{'} \\ &{\color{Green} E^{'}\to -TE^{'}|\varepsilon } \\ &T\to FT^{'}\\ &T^{'}\to *FT^{'}|\varepsilon \\ &F\to rP|P\\ &P\to (E)|i\\ \end{aligned} ETEETEεTFTTFTεFrPPP(E)i

非终极符FirstFollow
E E E { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { # } \left \{ \# \right \} {#}
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε} E { # } _{E^{}}^{} \left \{ \# \right \} E{#}
T T T { r , ( , i } \left \{ r,(,i \right \} {r,(,i} E ′ { − , # } _{E^{'}}^{} \left \{ -,\# \right \} E{,#}
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε} { } \left \{ \right \} {}
F F F { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { } \left \{ \right \} {}
P P P { ( , i } \left \{ (,i \right \} {(,i} { } \left \{ \right \} {}

对产生式 T → F T ′ T\to FT^{'} TFT,更新 F , T ′ F,T^{'} F,T:
E → T E ′ E ′ → − T E ′ ∣ ε T → F T ′ T ′ → ∗ F T ′ ∣ ε F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &E\to TE^{'} \\ &E^{'}\to -TE^{'}|\varepsilon \\ &{\color{Green} T\to FT^{'}} \\ &T^{'}\to *FT^{'}|\varepsilon \\ &F\to rP|P\\ &P\to (E)|i\\ \end{aligned} ETEETEεTFTTFTεFrPPP(E)i

非终极符FirstFollow
E E E { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { # } \left \{ \# \right \} {#}
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε} E { # } _{E^{}}^{} \left \{ \# \right \} E{#}
T T T { r , ( , i } \left \{ r,(,i \right \} {r,(,i} E ′ { − , # } _{E^{'}}^{} \left \{ -,\# \right \} E{,#}
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε} T { − , # } _{T^{}}^{} \left \{ -,\# \right \} T{,#}
F F F { r , ( , i } \left \{ r,(,i \right \} {r,(,i} T ′ { − , # , ∗ } _{T^{'}}^{} \left \{ -,\# ,*\right \} T{,#,}
P P P { ( , i } \left \{ (,i \right \} {(,i} { } \left \{ \right \} {}

对产生式 T ′ → ∗ F T ′ T^{'} \to *FT^{'} TFT,更新 F , T ′ F,T^{'} F,T(没有发生变化):
E → T E ′ E ′ → − T E ′ ∣ ε T → F T ′ T ′ → ∗ F T ′ ∣ ε F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &E\to TE^{'} \\ &E^{'}\to -TE^{'}|\varepsilon \\ &T\to FT^{'}\\ &{\color{Green} T^{'}\to *FT^{'}|\varepsilon} \\ &F\to rP|P\\ &P\to (E)|i\\ \end{aligned} ETEETEεTFTTFTεFrPPP(E)i

非终极符FirstFollow
E E E { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { # } \left \{ \# \right \} {#}
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε} E { # } _{E^{}}^{} \left \{ \# \right \} E{#}
T T T { r , ( , i } \left \{ r,(,i \right \} {r,(,i} E ′ { − , # } _{E^{'}}^{} \left \{ -,\# \right \} E{,#}
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε} T { − , # } _{T^{}}^{} \left \{ -,\# \right \} T{,#}
F F F { r , ( , i } \left \{ r,(,i \right \} {r,(,i} T ′ { − , # , ∗ } _{T^{'}}^{} \left \{ -,\# ,*\right \} T{,#,}
P P P { ( , i } \left \{ (,i \right \} {(,i} { } \left \{ \right \} {}

对产生式 F → r P F\to rP FrP,更新 P P P:
E → T E ′ E ′ → − T E ′ ∣ ε T → F T ′ T ′ → ∗ F T ′ ∣ ε F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &E\to TE^{'} \\ &E^{'}\to -TE^{'}|\varepsilon \\ &T\to FT^{'}\\ &T^{'}\to *FT^{'}|\varepsilon \\ &{\color{Green} F\to rP|P} \\ &P\to (E)|i\\ \end{aligned} ETEETEεTFTTFTεFrPPP(E)i

非终极符FirstFollow
E E E { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { # } \left \{ \# \right \} {#}
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε} E { # } _{E^{}}^{} \left \{ \# \right \} E{#}
T T T { r , ( , i } \left \{ r,(,i \right \} {r,(,i} E ′ { − , # } _{E^{'}}^{} \left \{ -,\# \right \} E{,#}
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε} T { − , # } _{T^{}}^{} \left \{ -,\# \right \} T{,#}
F F F { r , ( , i } \left \{ r,(,i \right \} {r,(,i} T ′ { − , # , ∗ } _{T^{'}}^{} \left \{ -,\# ,*\right \} T{,#,}
P P P { ( , i } \left \{ (,i \right \} {(,i} F { − , # , ∗ } _{F}^{} \left \{ -,\# ,*\right \} F{,#,}

对产生式 F → P F\to P FP,更新 P P P(没有发生变化):
E → T E ′ E ′ → − T E ′ ∣ ε T → F T ′ T ′ → ∗ F T ′ ∣ ε F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &E\to TE^{'} \\ &E^{'}\to -TE^{'}|\varepsilon \\ &T\to FT^{'}\\ &T^{'}\to *FT^{'}|\varepsilon \\ &{\color{Green} F\to rP|P} \\ &P\to (E)|i\\ \end{aligned} ETEETEεTFTTFTεFrPPP(E)i

非终极符FirstFollow
E E E { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { # } \left \{ \# \right \} {#}
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε} E { # } _{E^{}}^{} \left \{ \# \right \} E{#}
T T T { r , ( , i } \left \{ r,(,i \right \} {r,(,i} E ′ { − , # } _{E^{'}}^{} \left \{ -,\# \right \} E{,#}
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε} T { − , # } _{T^{}}^{} \left \{ -,\# \right \} T{,#}
F F F { r , ( , i } \left \{ r,(,i \right \} {r,(,i} T ′ { − , # , ∗ } _{T^{'}}^{} \left \{ -,\# ,*\right \} T{,#,}
P P P { ( , i } \left \{ (,i \right \} {(,i} F { − , # , ∗ } _{F}^{} \left \{ -,\# ,*\right \} F{,#,}

对产生式 P → ( E ) P \to (E) P(E),更新 E E E:
E → T E ′ E ′ → − T E ′ ∣ ε T → F T ′ T ′ → ∗ F T ′ ∣ ε F → r P ∣ P P → ( E ) ∣ i \begin{aligned} &E\to TE^{'} \\ &E^{'}\to -TE^{'}|\varepsilon \\ &T\to FT^{'}\\ &T^{'}\to *FT^{'}|\varepsilon \\ &F\to rP|P\\ &{\color{Green} P\to (E)|i} \\ \end{aligned} ETEETEεTFTTFTεFrPPP(E)i

非终极符FirstFollow
E E E { r , ( , i } \left \{ r,(,i \right \} {r,(,i} { # , ) } \left \{ \# ,)\right \} {#,)}
E ′ E^{'} E { − , ε } \left \{ -,\varepsilon \right \} {,ε} E { # , ) } _{E^{}}^{} \left \{ \# ,)\right \} E{#,)}
T T T { r , ( , i } \left \{ r,(,i \right \} {r,(,i} E ′ { − , # , ) } _{E^{'}}^{} \left \{ -,\#,) \right \} E{,#,)}
T ′ T^{'} T { ∗ , ε } \left \{ *,\varepsilon \right \} {,ε} T { − , # , ) } _{T^{}}^{} \left \{ -,\# ,)\right \} T{,#,)}
F F F { r , ( , i } \left \{ r,(,i \right \} {r,(,i} T ′ { − , # , ∗ , ) } _{T^{'}}^{} \left \{ -,\# ,*,)\right \} T{,#,,)}
P P P { ( , i } \left \{ (,i \right \} {(,i} F { − , # , ∗ , ) } _{F}^{} \left \{ -,\# ,*,)\right \} F{,#,,)}

至此 F o l l o w Follow Follow集求解完毕。计算 P r e d i c t Predict Predict集:
P r e d i c t ( E → T E ′ ) = { r , ( , i } Predict(E\to TE^{'} )=\left \{ r,(,i \right \} Predict(ETE)={r,(,i} P r e d i c t ( E ′ → − T E ′ ) = { − } Predict(E^{'} \to -TE^{'} )=\left \{ - \right \} Predict(ETE)={} P r e d i c t ( E ′ → ε ) = { # , ) } Predict(E^{'} \to \varepsilon )=\left \{ \#,) \right \} Predict(Eε)={#,)} P r e d i c t ( T → F T ′ ) = { r , ( , i } Predict(T\to FT^{'} )=\left \{ r,(,i \right \} Predict(TFT)={r,(,i} P r e d i c t ( T ′ → ∗ F T ′ ) = { ∗ } Predict(T^{'} \to *FT^{'} )=\left \{ * \right \} Predict(TFT)={} P r e d i c t ( T ′ → ε ) = { − , # , ) } Predict(T^{'} \to \varepsilon )=\left \{ -,\#,) \right \} Predict(Tε)={,#,)} P r e d i c t ( F → r P ) = { r } Predict(F \to rP )=\left \{ r \right \} Predict(FrP)={r} P r e d i c t ( F → P ) = { ( , i } Predict(F \to P )=\left \{ (,i \right \} Predict(FP)={(,i} P r e d i c t ( P → ( E ) ) = { ( } Predict(P\to (E) )=\left \{ ( \right \} Predict(P(E))={(} P r e d i c t ( P → i ) = { i } Predict(P\to i)=\left \{ i\right \} Predict(Pi)={i}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值