计算FOLLOW集

时间:2017-03-13 17:45:21

标签: parsing compiler-construction grammar ll

我的任务是计算以下语法的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,如果这对于以后构建解析器也没问题。谢谢

1 个答案:

答案 0 :(得分:1)

计算FOLLOW集时,必须小心空制作。

在这种情况下,CS生产空白,这意味着S后面可能跟. P → S CS .。同样,C中的C CS可能在制作结束时,C也可能后跟.

int只能在leftright令牌之后显示。它永远不会出现在nom终端的开头,也不会立即出现在非终端之后。所以完全可以预期它不会出现在任何FIRST或FOLLOW中。