Parsing 计算下列集合

Parsing 计算下列集合,parsing,compiler-construction,grammar,ll,Parsing,Compiler Construction,Grammar,Ll,我的任务是计算以下语法的第一和第二集合: 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 ::= 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}

我使用first和follow sets generator尝试了我的解决方案,follow得到的结果是:
follow(S)={'.',left,right,low}
。发电机的解决方案正确吗?为什么?我用公式计算了我的解:
FOLLOW(S)=FIRST({left,right,low}concat FOLLOW(P))={left,right,low}
。有人能给我解释一下为什么我的/发电机的解决方案不正确,并检查我是否把其他的一切都做对了吗?我还想知道为什么在任何第一个或后续集合中都没有
int
,以及这是否可以在以后构建解析器。谢谢你

当你计算下列集合时,你必须小心​ 空产品

在这种情况下,
CS
有一个空的结果,这意味着
S
可能在
p中后跟一个
→ S CS.
。类似地,
ccs
中的
C
可能在生产结束时,因此
C
后面也可能跟着一个


int
只能出现在
left
right
标记之后。它不能出现在nom终端的开头,也不能紧跟在非终端之后。因此,完全可以预期,它不会出现在任何第一组或后续组中。

谢谢:)我想我现在完全理解了第一组和后续组的工作原理。我还有一个问题。根据这些规则如何确定跟随集,我看不到任何规则会将“.”包含到我的跟随集中。。。我只是需要小心对待像这样的空产品,还是有一个规则决定了这一点?这是我在回答的第二段中指定的规则,
P→ S CS.
。如果CS是空的,点紧跟着S。或者我不明白你的意思。非终结符的FOLLOW集合是一组令牌,可以在该非终结符的实例之后的输入中出现。