即Follow(A) <== First(B) - ε,Follow(B) <== Follow(E) B=>*ε,即经过若干步的推导B能推导出ε,则不仅需要将B的Follow集加入A的Follow集,E的Follow集加入B的Follow集合,还需要将E的Follow集合加入A的Follow集合。即Follow(A) <== First(B) - ε+Follow(E),Follow(B) <== Follow(E)。 例...
(1)就是说如果对开始符号求 FOLLOW(S) ,直接来个 # ∈FOLLOW(S) ,不过要表示成 {#}(2)就是把后面的紧跟的终结符,就直接加到 FOLLOW 集(3)正经的求 B 的 FOLLOW 集,就是 B 后面 β的 FIRST(β) - {ε}(4)分情况:如果A -> αB,就把 FOLLOW(A) 加至 FOLLOW(B) 中 A -> αBβ 是一...
如果某个非终结符可能推出空串的话,那么空串也在它的FIRST集里。例:A -> ba | dc | ε 那么FIRST(A) 等于 { b, d, ε }。 一个文法符号A的FOLLOW集合就是它的下一个文法符号B的FIRST集合。如果下一个文法符号B的FIRST集合包含ε,那么我们就要获取下一个文法符号B 的 FOLLOW集添加到FOLLOW(A)中. S...
1. 首先看开始符E 默认开始符E的 follow集中存在$(#)结束符 然后在产生式的右部分找有没有E了,然后看见5中有E ,E后面的是终结符 ')' 所以就加在FOLLOW(E)={ $ , ) }中 2. 再看E' ,在文法的右部分找有E'的产生式 找到1和2 因为E'是句型的最右符号 所以follow(E') 包括follow(E) 所以foll...
First(L)={e} # L只能推导出一个表达式,并且开头是终结符,所以添加{e} ## 最后将已知的表达式代入到未知的表达式当中去,即可求出全部First集合 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Follow计算 ...
1.为什么要引入FIRST集的概念? 因为有公共左因子的问题,公共左公因子是指在文法的产生式集合中,某个非终结符的多个候选式具有相同的前缀。 一般来说,公共左公因子的产生式为 A→αβ1│αβ2A→αβ1│αβ2 如果有公共左因子的问题,那么只能采取试探的方法来分析每一个候选式,分析的过程很可能产生回溯,回溯...
Select集的作用是将first集和follow集进行合并,如果两个文法的左端都是A,若他们的select集交集为空,...
(一)FIRST集和FOLLOW集的计算 1.计算文法符号X的FIRST(X ) FIRST ( X ):可以从X推导出的所有串首终结符构成的集合 如果X=>* ε,那么 ε∈FIRST ( X ) (1)首先观察产生式的右部,如果有终结符,直接把终结符加入First集中,这里产生式2,4,5可以直接看出该式由终结符开头,所以把开头的终结符分别加入到...
若A的follow集里面含有c 则语言是合法的 Select集的作用是将first集和follow集进行合并,如果两个文法的左端都是A,若他们的select集交集为空,表明他们是两个无关的,不会产生不确定性的文法,反之,则表明文法不是LL(1)文法 计算的公式很繁杂,理解了意思之后,看就能看出来。。。
所以对给定的文法需要计算FIRST、FOLLOW、SELECT集,进而判断文法是否为LL(1)文法。这里我们用简单的语言来介绍求FIRST集和FOLLOW集的方法。FIRST集:所给定的文法符号的串首终结符。这里介绍一下串首终结符的概念。串首即所给串的第一个,而终结符的意思就是不能再向下推出任何东西的符号。在编译原理中一般使用小写...