First
如A->aB | CD
这里面包含了组成First(A)的两种情况:
以终结符开头, 当然要把这个终结符放到A的First里
以非终结符开头, 先把C的First放到A的First里
再看如果C的First中有空的话就把D的First放到A的First里,如果D也有空的话往后依次类推
技巧:First一般从下往上找。
如果要找A的First,我们要找A的定义式,即A在左边的式子,看着他的右边来找。
Follow
如S->(L) | aL | LC
找Follow的三种情况:先在候选式(右边)中找到该非终结符,如L(注意例中只有一个定义,但找Follow要看到所有右边出现该非终结符的)
如果L的右边是终结符, 那么这个终结符加入L的Follow
如果L的右边是非终结符, 那么把这个非终结符的First除去空加到L的Follow中
如果L处在末尾, 那么,’->'左边符号的Follow成为L的Follow
另外要注意的是:
开始符号的Follow中要加上‘#’
技巧:Follow一般从上往下找。
如果要找L的Follow,要从式子的右边找到L,然后来找L的Follow,这与First是不同的。
First集构造流程
对于 X -> … 这条产生式而言,
【1】若右边第一个符号是终结符或 ε ,则直接将其加入 First(X)
【2】若右边第一个符号是非终结符,则将其 First 集的的非 ε 元素加入 First(X)
【3】若右边第一个符号是非终结符而且紧随其后的是很多个非终结符,这个时候就要注意是否有 ε 。
【3.1】若第 i 个非终结符的 First 集有 ε ,则可将第 i+1 个非终结符去除 ε 的 First 集加入 First(X)。
【3.2】若所有的非终结符都能够推导出 ε ,则将 ε 也加入到 First(X)
E.G. G[S]:
S -> ABCD
A -> a | ε
B -> b | ε
C -> c
D -> d
解:
First(S) = {a, b, c},其中 c 是由上面所说的第二、三条规则所推得出来的,因为此时 A 和 B 都可以等于空串( ε ),所以非终结符 C 的 first 集合就被加入 G[S] 了。
如果这里 C,D 也能够产生 ε 的话,根据第三条规则中的第二小点,此时 First(S) = {a, b, c, d, ε}
Follow集构造流程
【1】将所有产生式的候选式(即产生式右部)的非终结符都找到,定位到你想要求解 Follow 集的非终结符的位置,从当前位置往后挨个检查。设 A -> aBC 是一个产生式,在这个产生式中, B 和 C 是非终结符,a 是终结符
【2】先检验这个非终结符的右边还有没有别的符号(终结符或非终结符都可以),在例子中 B 是需要检查的第一个非终结符,它的右边是有非终结符 C 的。
【2.1】若右边有符号 -> 将 First(右侧第一个符号)的非 ε 集合加入到 Follow(当前符号)中,如果 First(右侧第一个符号)含有 ε ,即有 … -> ε ,则将 Follow(产生式左部符号)加入 Follow(当前符号)中。
E.G. 用 A -> aBC 来说就是,当前扫描到 B 了,而 B 的右侧有非终结符 C,则将去掉 ε 的 First(C)加入 Follow(B)中。若存在 C -> ε ,则将 Follow(A)也加入 Follow(B)中。
【2.2】若右边没有符号了,例如这里的 C,那么可以将 Follow(A)中的元素全部加入到 Follow(C)中。
【3】判断当前符号是不是文法的开始符号,比如 G[A] 中的非终结符 A 就是 G[A] 文法的开始符号,如果是的话就将“#”也加入到 Follow(当前符号)中去。
预测表的构造
首先构造出预测分析表的第一行与第一列,第一行为文法出现的所有终结符以及‘#’(注意:没有 ε ,因为 Follow 集不含 ε),第一列为文法出现的所有非终结符。
然后对文法 G 的每个产生式 A -> ab 都执行如下操作:
【1】对于每个属于 First(ab) 的终结符 m ,都把 A -> ab 添加到预测表中的 [A, m] 中去
【2】如果 ε 也属于 First(ab),那么对于任何属于 Follow(A) 的字符 x,都把 A -> ε 加入到 [A, x] 中去
————全心全意投入,拒绝画地为牢
Firstvt
找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现:
A->a…,即以终结符开头,该终结符入Firstvt
A->B…,即以非终结符开头,该非终结符的Firstvt入A的Firstvt
A->Ba…,即先以非终结符开头,紧跟终结符,则终结符入Firstvt
Lastvt
找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:
A->…a,即以终结符结尾,该终结符入Lastvt
A->…B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt
A->…aB,即先以非终结符结尾,前面是终结符,则终结符入Firstvt