Parsing 计算语法的先行集和跟随集?

Parsing 计算语法的先行集和跟随集?,parsing,grammar,ll,Parsing,Grammar,Ll,我必须计算以下语法的第一组和第二组: S -> ABC A -> a | Cb | 1 B -> c | dA | 1 C -> e | f 然而,我不完全确定我是否理解如何去做。根据我的理解,我得到以下计算: FIRST(S)= {a, e, f, b, c, d} FIRST(A)= {a, e, f, 1} FIRST(B)= {c, d, a, e, f, b, 1} FIRST(C)= {e, f} FOLLOW(S)= {$} FOLLOW(A)= {c,

我必须计算以下语法的第一组和第二组:

S -> ABC
A -> a | Cb | 1
B -> c | dA | 1
C -> e | f
然而,我不完全确定我是否理解如何去做。根据我的理解,我得到以下计算:

FIRST(S)= {a, e, f, b, c, d}
FIRST(A)= {a, e, f, 1}
FIRST(B)= {c, d, a, e, f, b, 1}
FIRST(C)= {e, f}

FOLLOW(S)= {$}
FOLLOW(A)= {c, d, a, e, f, b}
FOLLOW(B)= {e, f}
FOLLOW(C)= {$}
这是正确的吗?我错过什么了吗?如果是这样的话,请有人解释一下我遗漏了什么,以及我将如何计算正确的第一和第二集合?另外,通过查看生成的集合,我如何判断它是否是LL(1)语法?

当S(目标非终结符符号)展开时,其派生中的第一个终结符必须来自A only,因为这正是语法在S->ABC中指示的。(除非语法中的“1”表示ε,即右手边的空边;在本例中,我们转到B并找到B的第一个集合。)A可以直接扩展到A和1,并通过C扩展到e和f。第一组S是a,1,e,f(所有这些终端的并集)。语法看起来是LL(1),因为每个实际的标记似乎决定在派生的每个步骤中使用哪一个右手边。计算所有前几组以确认此猜测。如果同一个终端位于同一个非终端LHS的两个RHS的第一个集合中,则语法不是LL(1),因为该终端将导致在派生中使用哪个产品的选择出现歧义。LL(1)语法必须是明确的,并且每个非终结符都有一个非空的第一个条目,这意味着该语法没有左递归

请注意,不需要FOLLOW集合,因为不存在右端为空的结果(此类结果可用于在LL(1)语法中建模LL(2)语言,但代价是增加解析器的复杂性)。

当S(目标非终结符)扩展时,其派生的第一个终结符必须仅来自A,因为这正是语法在S->ABC中指出的。(除非语法中的“1”表示ε,即右手边的空边;在本例中,我们转到B并找到B的第一个集合。)A可以直接扩展到A和1,并通过C扩展到e和f。第一组S是a,1,e,f(所有这些终端的并集)。语法看起来是LL(1),因为每个实际的标记似乎决定在派生的每个步骤中使用哪一个右手边。计算所有前几组以确认此猜测。如果同一个终端位于同一个非终端LHS的两个RHS的第一个集合中,则语法不是LL(1),因为该终端将导致在派生中使用哪个产品的选择出现歧义。LL(1)语法必须是明确的,并且每个非终结符都有一个非空的第一个条目,这意味着该语法没有左递归


请注意,不需要以下集合,因为没有右侧为空的产品(此类产品可用于在LL(1)语法中建模LL(2)语言,但代价是增加解析器的复杂性)。

不确定您的意思,请不要
S
从什么
ABC
开始?抱歉,我不太明白你要去哪里。First(S)不是First(A)、First(B)和First(C)的结合吗?我相信是的,这是教科书上的一个例子,但它没有说明它的意思,也没有说明如何解决语法的First/FOLLOW。所以我假设它的意思是空的,也就是λ(通常是ε),而不是1。我相信课文中有一个解释,FIRST(S)不是FIRST(A)和FIRST(B)的结合。看到我的答案了。我不知道你的意思,难道不是从ABC开始的吗?对不起,我不太明白你要去哪里。First(S)不是First(A)、First(B)和First(C)的结合吗?我相信是的,这是教科书上的一个例子,但它没有说明它的意思,也没有说明如何解决语法的First/FOLLOW。所以我假设它的意思是空的,也就是λ(通常是ε),而不是1。我相信课文中有一个解释,FIRST(S)不是FIRST(A)和FIRST(B)的结合。看看我的答案。