我的任务是计算以下语法的FIRST和FOLLOW集:
P ::= S CS .
S ::= ( int , int )
CS ::= C CS | epsilon
C ::= left int | right int | low C
我得到了以下第一套:
FIRST(S) = {'('}
FIRST(C) = {left,right,low}
FIRST(CS) = {left,right,low,epsilon}
FIRST(P) = FIRST(S) = {'('}
对于我计算的以下几组:
FOLLOW(P) = $ (or empty)
FOLLOW(C) = {left,right,low,'.'}
FOLLOW(CS) = {'.'}
FOLLOW(S) = {left,right,low}
我使用第一个和跟随集生成器尝试了我的解决方案,我用FOLLOW(S)得到的是:FOLLOW(S) = {'.', left, right, low}
。发电机的解决方案是否正确?为什么?我使用公式FOLLOW(S) = FIRST({left,right,low} concat FOLLOW(P)) = {left, right, low}
计算了我的解决方案。有人可以解释一下为什么我/发电机的解决方案不正确并检查我是否还有其他一切正确吗?我也想知道为什么我在任何第一组或后续组中没有int
,如果这对于以后构建解析器也没问题。谢谢
答案 0 :(得分:1)
计算FOLLOW集时,必须小心空制作。
在这种情况下,CS
生产空白,这意味着S
后面可能跟.
P → S CS .
。同样,C
中的C CS
可能在制作结束时,C
也可能后跟.
int
只能在left
或right
令牌之后显示。它永远不会出现在nom终端的开头,也不会立即出现在非终端之后。所以完全可以预期它不会出现在任何FIRST或FOLLOW中。