构造预测分析表算法
对于文法G的每个产生式A -> α ,进行如下处理:
1. 对于FIRST(α)中的每个终结符号a,将A -> α加入到M[A , a]中。
2. 如果 ε 在FIRST(α) 中,那么对于FOLLOW(A)中的每个终结符号b,将A -> α加入到M[A , b]中。如果 ε 在FIRST(α) 中,且$在FOLLOW(A)中,也将A -> α加入到M[A , $]中。
在完成上面的操作之后,如果没有M[A , a]中没有产生式,那么将M[A , a]设置为error(我们通常采用一个空条目表示)
举个小栗子
文法G[E]:
1. E -> TE’
2. E’-> +E| ε
3. T -> FT’
4. T’-> T| ε
5. F -> PF’
6. F’ -> *F’| ε
7. P -> (E) | a | b | ∩
证明该文法是LL(1)文法
(1) FIRST集合(这里只求非终结符号的FIRST集合)
FIRST(E) = { ( , a , b , ∩ }
FIRST(T) = { ( , a , b , ∩ }
FIRST(F) = { ( , a , b , ∩ };
FIRST(P) = { ( , a , b , ∩ };
FIRST(E’) = { + , ε };
FIRST(T’) = { ( , a , b , ∩ , ε };
FIRST(F’) = { * , ε };
(2) FOLLOW集合
FOLLOW(E) = FOLLOW(E’) + { ) ,$}
FOLLOW(E’) = FOLLOW(E) = { ) ,\$ }
FOLLOW(T) = FIRST(E’) / ε +FOLLOW(T’) = { + , ) , \$ }
FOLLOW(T’) = FOLLOW(T) = { + , ) , \$ }
FOLLOW(F) = FIRST(T’) / ε +FOLLOW(T) = { ( , a , b , ∩ , + , ) ,\$ }
FOLLOW(F’) = FOLLOW(F) = { ( , a , b , ∩ , + , ) ,\$ }
FOLLOW(P) = FIRST(F’) / ε + FOLLOW(F) = {* , ( , a , b , ∩ , + , ), \$ }
注:关于FIRST集合和FOLLOW集合的计算,请参照这篇博客