三种集合的求法:
若S=>μAβ,且β=>ε,则#属于FOLLOW(A)。
- FIRST集:FIRST(α)= {a|α=>aβ,a∈VT,β∈V*},
若α=>ε,则规定ε∈FIRST(α)。
- FOLLOW集:(就是非终结符右边的字符能推出的第一个字符的集合)
FOLLOW(A)={a|S=>μAβ且a∈VT,a∈FIRST(β),μ∈VT*,β∈V+}
若S=>μAβ,且β=>ε,则#属于FOLLOW(A)。
- SELECT集:若α=>ε,则SELECT(A->α)= FIRST(α)
如果α=>ε,则SELECT(A->α)=(FIRST(α)-{ε})∪FOLLOW(A).
上下文无关文法为LL(1)文法的充分必要条件:
Select(A->α)∩ SELECT(A->β) = ∅
例:文法G[S]为:
S->AB
S->bC
A->ε
A->b
B->ε
B->aD
C->AD
C->b
D->aS
D->c
为了方便起见,首先求出能推出ε的非终结符,为S,A,B
求出FIRST集,求出FOLLOW集,求出SELECT集
FIRST集(分别求出产生式左边和右边的FIRST集)
FIRST(S)={a,b,ε}
FIRST(A)={b,ε}
FIRST(B)={a,ε}
FIRST(C)={a,b,c}
FIRST(D)={a,c}
FIRST(AB)={a,b,ε}
FIRST(bC)={b}
FIRST(ε)={ε}
FIRST(b)={b}
FIRST(aD)={a}
FIRST(AD)={a,b,c}
FIRST(b)={b}
FIRST(aS)={a}
FIRST(c)={c}
FOLLOW集:
FOLLOW(S)={#}
FOLLOW(A)={a,#,c} FOLLOW(A)=(FIRST(B)-{ε}) ∪ FOLLOW(S) ∪ FIRST(D)
FOLLOW(B)={#}
FOLLOW(C)={#}
FOLLOW(D)={#}
SELECT集:
最后再判别一下是不是LL(1)文法,用相同的左部的select集相交看是否为∅
构造预测分析表(另一题)
写分析过程(根据表达式)