语法中是否存在跟随跟随冲突?

时间:2018-12-14 07:00:48

标签: parsing compiler-construction ll

我知道语法中存在First / First和First / Follow冲突,该语法使语法“不是LL(1)”。我只是想知道语法中是否存在跟随/跟随冲突。

2 个答案:

答案 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。请注意,没有其他冲突。