我有以下语法,我正在努力学习如何先做并遵循。我想我有第一个正确的。但是,由于非终结符C,FOLLOW会引起混淆。
这是语法:
S --> ABC
A --> a | Cb |ε
B --> C | dA | ε
C --> e | f
对于FIRST:
First(S) = First(A)-{ε} + First(C) = { a,f, e, ε}
First(B) = First(C) = {d,e,f,ε}
对于FOLLOW:
Follow(S) = {ε}
Follow(A) = First(B)-{ε} + First(C) = {a,e,f}
Follow(B) = Follow(C) = Follow(S) = { $}
Follow(C) = Follow(B) = Follow(S) = {b, $}
我遇到问题,因为生产A和B中有两个C? 我接近这个吗?
答案 0 :(得分:0)
我认为First已经错了。
由于A和B是可选的,而C首先是非空的:
First(S) = First(A) + First(B) + First(C) - {ε}
First(A) = {a} + First(C) + {ε}
First(B) = First(C) + {d, ε}
First(C) = {e, f}
=>
First(A) = {a, e, f, ε}
First(B) = {d, e, f, ε}
=>
First(S) = {a, d, e, f}
首先出现后是nt, 最后遵循规则。
Follow(S) = {$}
Follow(A) = First(B) - {ε} + Follow(B) = {d, e, f}
Follow(B) = First(C) = {e, f}
Follow(C) = Follow(S) + Follow(B) + {b} = {b, e, f, $}
(我希望我做对了。)
详细信息:
Follow(S) = {$} [Start rule]
Follow(A) = First(B) - {ε} [S --> A.BC]
+ First(C) [S --> AB.C as B or First(B) contains ε]
+ Follow(B) [B. --> C | dA. | ε]
Follow(B) = First(C) [S --> AB.C as C does not contain ε stops]
Follow(C) = Follow(S) [S. --> ABC.]
+ {b} [A --> a | C.b |ε]
+ Follow(B) [B. --> C. | dA | ε]
LHS上的点,如X. - > ...结果跟随(S);
RHS上的点像...... - > ...... .X ......导致第一(X) - {ε} 虽然X有ε-产生,但继续:... - > ...... X. ......
请注意,这些是“我的”规则,您的书可能会使用稍微不同的代数。
答案 1 :(得分:0)
我正在回答以下语法。由于第一次已经正确回答。
follow(S) = {$};
follow(A) = {$,d,e,f};
follow(B) = {$,e,f};
follow(C) = {$,b,e,f};
在A,B和C中包含'$'的原因是。如果有生产A --->语法中的ABC,其中C可以为空,那么Follow(A)中的所有内容都将遵循(B)。