我知道语法中存在First / First和First / Follow冲突,该语法使语法“不是LL(1)”。我只是想知道语法中是否存在跟随/跟随冲突。
答案 0 :(得分:1)
是的,这是可能的,但是需要一种不寻常的配置才能实现。考虑下面的语法,该语法已经增加了新的开始符号:
S'→S $
S→tT
T→A | B
A→ε
B→ε
现在,让我们想象一下尝试填充我们的LL(1)解析表,如下所示:
$ t
+----------+----------+
S' | | S' -> S$ |
+----------+----------+
S | | S -> tT |
+----------+----------+
T | T -> A | |
| T -> B | |
+----------+----------+
A | A -> e | |
+----------+----------+
B | B -> e | |
+----------+----------+
请注意,条目(T,$)中有两个项目。这是有道理的:如果我们有活动的非终结符T并看到$,我们知道我们需要选择一个将扩展为空字符串的生产。我们有两种不同的方法:可以使用T→A或T→B,其最终目标是将每个非终结符扩展为空字符串。这是一个问题-我们无法预测走哪条路线。
现在,这是什么冲突?这不能是FIRST / FIRST冲突,因为FIRST(A)= {ε}并且FIRST(B)= {ε},因此A和B都没有在其第一集合中有任何终端。出于相同的原因,这不能是FIRST / FOLLOW冲突。
这意味着这是罕见的FOLLOW / FOLLOW冲突-我们知道我们将根据A和B的FOLLOW集合中的内容来选择生产,但是它们彼此完全相同,因此解析器可以不要明确选择下一步做什么。
答案 1 :(得分:0)
这也许是一个更简单的示例
S → A a
A → B | C
B → ε
C → ε
在这里,由于a
既在FOLLOW
的{{1}}中又在B
中,所以C
上的(A, a)
之间会有冲突和A → B
。请注意,没有其他冲突。