好的,我已经了解了如何计算Follow_k(N)集(N是非终结符):对于形式A的每个生产规则 - > aBc你将First_k(First_k(c)Follow_k(A))添加到Follow_k(B)(a,c是任何一组终端和非终端,甚至是lambda)。 ......然后你重复这个,直到没有什么可以补充的。
但生产规则的情况如下:S - > ABCD(A,B,C,D都是非终结符)?
我应该
将First_k(First_k(BCD)Follow_k(S))添加到Follow_k(A)或
将First_k(First_k(CD)Follow_k(S))添加到Follow_k(B)或
将First_k(First_k(D)Follow_k(S))添加到Follow_k(C)或
将First_k(First_k(lambda)Follow_k(S))添加到Follow_k(D)或
完成上述所有工作?
更新:
我们以下面的语法为例:
S - > ABC
A - >一个
B - > b
C - > Ç
直观地说,Follow_1(S)= {}因为在S
之后没有任何内容
Follow_1(A)= {b}因为b跟在A,
之后
Follow_1(B)= {c}因为c跟在B,
之后
Follow_1(C)= {}因为在C.之后没有任何内容
为了使用算法得到这个结果,你必须考虑S - >的所有情况。 ABC
但我的判断或例子可能不对,所以问题仍然存在......
答案 0 :(得分:2)
如果您在遇到其他类似的语法问题时遇到麻烦,请给这个online first, follow, & predict set finder一个机会。它是自动的,您可以比较其输出的答案,以了解如何解决这些问题。
但是生产规则会发生什么,例如:S - > ABCD(A,B,C,D都是非终结符)?
以下是rules for finding follow sets。
- 首先将$(输入标记的结尾)放在Follow(S)中(S是起始符号)
- 如果有生产A→aBb,(其中a可以是整个字符串)那么FIRST(b)中除ε之外的所有内容都放在FOLLOW(B)中。
- 如果有生产A→aB,那么FOLLOW(A)中的所有内容都在FOLLOW(B)
- 如果有生产A→aBb,其中FIRST(b)包含ε,那么FOLLOW(A)中的所有内容都在FOLLOW(B)
醇>
让我们使用你的示例语法:
C - > ç
Nullability transitivity可以煽动人们。考虑一下这个语法:
由于B导出ε,B可以为空。由于A导出B,它导出ε,A也可以为空。 S派生A,派生B,派生ε,所以S也可以为空。
当然,你没有把它提起来,但它是编译器课程混乱的常见原因,所以我想我会把它解决。
此外,如果您需要一些示例语法,http://faculty.stedwards.edu/laurab/cosc4342/g1answers.txt可能会很方便。