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