文法G[E]:????????????????????????????????????????????EE+T|T
TT*F|F
?????????????????????????????????????????????????????????????Fi|(E)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 构造预测分析表。?
?VN排列为E,T,F
消除E的一切直接左递归:
? ? ? ? ETE'? ? ? ? TT*F? ? ? ? Fi
? ? ? ? E'+E'|ε? ? TF? ? ? ? ? ?F(E)
消除T的一切直接左递归:
? ? ? ? ETE'? ? ? ? TFT'? ? ? ? Fi
? ? ? ? E'+E'|ε? ? T^*FT'|ε? ?F(E)
F没有左递归
文法无左公因子。
所以,提取左公因子和消除左递归后的文法为:? ? ? ?
????????ETE'? ? ? ? TFT'? ? ? ? Fi
? ? ? ? E'+E'? ?? ? T^*FT'??? ?F(E)
? ? ? ? E'ε? ? ? ? ? ?Tε
1、求First集:
????????First(E)={ i,( }
????????First(E')={ +,ε }
????????First(T)={ i,( }
????????First(T')={ *,ε }
????????First(F)={ i,( }
2、求Follow集:
? ? ? ??Follow(E)={ i,( }
????????Follow(E')={ +,ε }
????????Follow(T)={ i,( }????????Follow(T')={ *,ε }
????????Follow(F)={ i,( }
3、求Select集:? ? ??
????????SELECT (E→TE')?= First(TE') = { i, ( }
????????SELECT(E'→+iE') = First (+TE') = { + }
????????SELECT(E'→ε) = Follow(E') ={ #, ) }?
????????SELECT (T→FT') = First(FT') = { i, ( }?
????????SELECT(T'→*FT')= First(*FT') = { * }
????????SELECT(T'→ε )=Follow(T')={ +, #, ) }?
????????SELECT(F→(E)) = First((E)) = { ( }?
????????SELECT(F→i) = First(i) = { i }
4、判定:
????????SELECT(E'→+TE')? SELECT(E'→ε )= Φ
? ? ? ? SELECT(T'→*FT') SELECT(T'→ε ) = Φ?
? ? ? ? SELECT(F→(E) ) SELECT(F→i) =Φ
构造预测分析表M的方法:
M是二维数组,元素是M[A,a]
其中A是非终结符,a是终结符或“#”。
若aESELECT(A→a),则把A→a放入M[A,a]中。 (所有空白的M[A,a]表示出错。)
? #i+i*I#
求=关系
求<关系:找……aB……, a<FirstVT(B)
求>关系:找……Bc……, LastVT(B)>c
文法G[E]:
E`→#E#
E→E+T
E→T
T→T*F
T→F
F→P^F
F→P
P→(E)
P→i????????
构造算符优先关系表
#i+i#?
未完待续......?