文章目录
- 预测分析法的工作过程
- S_文法(简单的确定性文法)
- 什么时候使用$\epsilon$产生式?
- 非终结符的后继符号集
- 产生式的可选集
- q_文法
- 串首终结符集
- LL(1)文法
预测分析法的工作过程
从文法开始符号触发,在每一步推导过程中根据当前句型的最左非终结符A
和当前输入符号a
,选择正确的A
-产生式。为保证分析的确定性,选出的候选式必须是唯一的。
S_文法(简单的确定性文法)
特点:
- 每个产生式的右部都以终结符开始。
- 同一非终结符的各个候选式的首终结符都不同。
- S_文法不包含 ϵ \epsilon ϵ产生式
什么时候使用 ϵ \epsilon ϵ产生式?
如果当前某非终结符A
与当前输入符a
不匹配时,若存在
A
→
ϵ
A \rightarrow{\epsilon}
A→ϵ,可通过检查a
是否可以出现在A
的后面,来决定是否使用产生式
A
→
ϵ
A \rightarrow{\epsilon}
A→ϵ。(若文法中无
A
→
ϵ
A \rightarrow{\epsilon}
A→ϵ,则应报错)。
例:
文法:
- S → a B C S\rightarrow{aBC} S→aBC
- B → b C B \rightarrow{bC} B→bC
- B → d B B\rightarrow{dB} B→dB
- B → ϵ B \rightarrow{\epsilon} B→ϵ
- C → c C\rightarrow{c} C→c
- C → a C \rightarrow{a} C→a
- D → e D \rightarrow{e} D→e
输入:
a d a
推导:
a B C ⇒ a d B C ⇒ a d C ⇒ a d a aBC \Rightarrow{adBC \Rightarrow{adC \Rightarrow{ada}}} aBC⇒adBC⇒adC⇒ada
可以看到在第三步推导中,B
转成了空串。而上述文字的意思就是,由于此时输入的字符是a
,而B没有候选式能够匹配,因此检查a
能否出现在B
的后面。换句话说,看看B
后面的C
能不能匹配a
。 如果可以匹配则可以使用B
的
ϵ
\epsilon
ϵ产生式,没有则报错。
非终结符的后继符号集
可能在某个句型中紧跟在A
后边的终结符a
的集合,即为FOLLOW(A),
F
O
L
L
O
W
(
A
)
=
{
a
∣
⇒
∗
α
A
a
β
,
a
∈
V
T
,
a
,
β
∈
(
V
T
∪
V
N
)
∗
}
FOLLOW(A) = \{a | \Rightarrow^*{\alpha A a \beta}, a \in V_T, a,\beta \in (V_T \cup V_N)^*\}
FOLLOW(A)={a∣⇒∗αAaβ,a∈VT,a,β∈(VT∪VN)∗}
注:如果A
是某个句型的最右符号,则将结束符$添加到FOLLOW(A)中。
例:
- S → a B C S\rightarrow{aBC} S→aBC
- B → b C B \rightarrow{bC} B→bC
- B → d B B\rightarrow{dB} B→dB
- B → ϵ B \rightarrow{\epsilon} B→ϵ
- C → c C\rightarrow{c} C→c
- C → a C \rightarrow{a} C→a
那么 F O L L O W ( B ) = { a , c } FOLLOW(B)= \{a, c\} FOLLOW(B)={a,c}。
换句话说,当输入为b
或d
时,选择产生式2或3。而当输入为a或c时,选择产生式4。
产生式的可选集
产生式 A → β A \rightarrow{\beta} A→β的可选集是指可以选用该产生式进行推导时对应的输入符号的集合,记为 S E L E C T ( A → β ) SELECT(A \rightarrow{\beta}) SELECT(A→β)。也就是说,当遇到可选集中的字符输入时,可以选用可选集对应的产生式。
- S E L E C T ( A → a β ) = a SELECT(A \rightarrow{a \beta}) = {a} SELECT(A→aβ)=a
- S E L E C T ( A → ϵ ) SELECT(A \rightarrow{\epsilon}) SELECT(A→ϵ) = F O L L O W ( A ) FOLLOW(A) FOLLOW(A)
q_文法
- 每个产生式的右部或为 ϵ \epsilon ϵ,或以终结符开始
- 具有相同左部的产生式有不相交的可选集。
- q_文法不含右部以非终结符打头的产生式。
串首终结符集
- 串首终结符:串的第一个符号,并且是终结符。简称首终结符。
- 给定一个文法符号串
α
\alpha
α,
α
\alpha
α的串首终结符集
F
I
R
S
T
(
α
)
FIRST(\alpha)
FIRST(α)被定义为可以从
α
\alpha
α推导出的所有串首终结符构成的集合。如果
α
⇒
∗
ϵ
\alpha \Rightarrow^*{\epsilon}
α⇒∗ϵ,那么
ϵ
\epsilon
ϵ也在
F
I
R
S
T
(
α
)
FIRST(\alpha)
FIRST(α)中
- 对于 ∀ α ∈ ( V T ∪ V N ) + \forall\alpha \in(V_T \cup V_N)^+ ∀α∈(VT∪VN)+, F I R S T ( α ) = a ∣ α ⇒ ∗ a β , a ∈ V T , β ∈ ( V T ∪ V N ) FIRST(\alpha)={a | \alpha \Rightarrow^*{a\beta},a \in V_T, \beta \in (V_T \cup V_N)} FIRST(α)=a∣α⇒∗aβ,a∈VT,β∈(VT∪VN)
- 如果 α ⇒ ∗ ϵ \alpha \Rightarrow^*{\epsilon} α⇒∗ϵ,那么 ϵ ∈ F I R S T ( α ) \epsilon \in FIRST(\alpha) ϵ∈FIRST(α)。( α \alpha α中的每一个符号都是非终结符,且每一个非终结符都能推导出空串)
- 产生式
A
→
α
A \rightarrow{\alpha}
A→α的可选集
S
E
L
E
C
T
SELECT
SELECT
- 如果 ϵ ∉ F I R S T ( α ) \epsilon \notin FIRST(\alpha) ϵ∈/FIRST(α),那么 S E L E C T ( A → α ) = F I R S T ( α ) SELECT(A \rightarrow{\alpha}) = FIRST(\alpha) SELECT(A→α)=FIRST(α)
- 如果 ϵ ∈ F I R S T ( α ) \epsilon \in FIRST(\alpha) ϵ∈FIRST(α),那么 S E L E C T ( A → α ) = ( F I R S T ( α ) − { ϵ } ) ∪ F O L L O W ( A ) SELECT(A \rightarrow{\alpha}) = (FIRST(\alpha) - \{\epsilon\}) \cup FOLLOW(A) SELECT(A→α)=(FIRST(α)−{ϵ})∪FOLLOW(A)
LL(1)文法
文法G是 L L ( 1 ) LL(1) LL(1)的,当且仅当G的任意两个具有相同左部的产生式 A → α ∣ β A \rightarrow{\alpha | \beta} A→α∣β满足下面的条件:
- 不存在终结符
a
使得 α \alpha α和 β \beta β都能推导出以a
开头的串。 - α \alpha α和 β \beta β至多有一个能推导出 ϵ \epsilon ϵ
- 如果 β ⇒ ∗ ϵ \beta \Rightarrow^*{\epsilon} β⇒∗ϵ,则 F I R S T ( α ) ∩ F O L L O W ( A ) = Φ FIRST(\alpha) \cap FOLLOW(A) = \Phi FIRST(α)∩FOLLOW(A)=Φ
- 如果 α ⇒ ∗ ϵ \alpha \Rightarrow^*{\epsilon} α⇒∗ϵ,则 F I R S T ( β ) ∩ F O L L O W ( A ) = Φ FIRST(\beta) \cap FOLLOW(A) = \Phi FIRST(β)∩FOLLOW(A)=Φ
因为如果 β ⇒ ∗ ϵ \beta \Rightarrow^*{\epsilon} β⇒∗ϵ,那么 S E L E C T ( β ) SELECT(\beta) SELECT(β)就包含了 F O L L O W ( A ) FOLLOW(A) FOLLOW(A),所以 F I R S T ( α ) FIRST(\alpha) FIRST(α)就不能包含 F O L L O W ( A ) FOLLOW(A) FOLLOW(A)中元素。不然两个的 S E L E C T SELECT SELECT集将会相交。
- 同一非终结符的各个产生式的可选集互不相交