第一题
答案:
第二题
答案:
first:
A:a,b,c,d,g
B:b,ε
C:a,c,d
D:d,ε
E:c,g
follow:
不要忘记$
求first非常容易错,知乎有很好的方法论:
- 若X->a…,则将终结符a加入FIRST(X)中;(注意非终结符的情况)
- 若X->e ,则将终结符e加入FIRST(X)中(e表示空集);
- 若 X->BC…D,则将First(B)所有元素(除了空集)加入First(X),然后检测First(B),若First(B)中不存在空集, 即e,则停止,若存在则向B的后面查看,将First(C)中所有元素(除了空集)加入First(X),然后再检测First(C)中是否有e…直 到最后,若D之前的所有非终结符的First集中都含有e,则检测到D时,将First(D)也加入First(X),若First(D)中含有e,则将 e加入First(X)。
总之看到epsilon要继续往后找,直到没有epsilon或能确定X可置空为止。
再一个简单例子,下面的,不能因为A的first集是epsilon,S的第一个符号是A,所以S的first集中就是epsilon,这是不对的,first集中有epsilon代表该符号可置空,而在下面这个例题中S推不出空。所以此时应该向后找,A的后面是a,a的first是本身a,到这里就可以停止了。
第三题
first:
S: a,b,ε
A:a,b
B:a,b
follow:
第四题(2010期末A卷第二题)
第五题(lws 模拟试卷一 第二题)
第六题
ref:
https://blog.csdn.net/Baron_wu/article/details/84994254
https://blog.csdn.net/RENSRM/article/details/111595754
https://zhuanlan.zhihu.com/p/268555826