参考哈工大课件
计算文法符号X的FIRST(X)
FIRST ( X ):可以从X推导出的所有串首终结符构成的集合
如果 X =>* ε,那么 ε∈FIRST ( X )
- 如果X是一个终结符或者 X→ε∈P,那么FIRST ( X ) = { X }或者将ε加入到FIRST( X )中
- 如果X是一个非终结符,且 X→Y1…Yk∈P (k≥1),那么如果对于某个i,a在FIRST (Yi ) 中且ε 在所有的FIRST(Y1) , … , FIRST(Yi-1)中(即Y1…Yi-1 =>* ε ),就把a加入到FIRST( X )中。如果对于所有的 j =1,2, . . . , k,ε在FIRST(Yj)中,那么将ε加入到FIRST( X )
计算非终结符A的FOLLOW(A)
FOLLOW(A):可能在某个句型中紧跟在A后边的终结符a的集合
FOLLOW(A)={a| S =>* αAaβ, a∈VT,α,β∈(VT∪VN)*}
如果A是某个句型的的最右符号,则将结束符“#”添加到FOLLOW(A)中
First | Follow | ||
---|---|---|---|
① E → TE’ | E | { ( id } | { # )} |
② E’ → +TE’ or ε | E’ | { + ε } | { # )} |
③ T → FT’ | T | { ( id } | { + # )} |
④ T’ → *FT’ or ε | T’ | { * ε } | { + # )} |
⑤ F → (E) or id | F | { ( id } | { * + # )} |
首先,E是句型的开始符号,也是某个句型的最右符号,所以将“#”加入follow集中。然后开始逐个分析每一条产生式。
根据①,E’的first集的所有终结符可以跟在T的后面,所以将firstE中所有终结符+,加入到E的follow集中。由于E’的first集中包含空串,因此所有能够跟在E后面的符号都能跟在T后面。所以将followE中的符号#加到followT中。E’是产生式①的最后一个符号&