LL(1)解析冲突

时间:2019-01-02 22:55:01

标签: parsing ll

我正在为一个非常简单的语法编写LL(1)解析器。但是,在尝试构建解析表时发现冲突。

我很惊讶,因为语法看起来很简单。我不知道解析器或对LL(1)解析的理解是否有问题。语法最后可能不是LL(1)。

语法是:

1: S         -> begin list
2: list      -> id    listPrime
3: listPrime -> id    listPrime
4:            | ε

我的代码遇到两个冲突,两个冲突都派生listPrime,一个冲突带有终端符号id,另一个冲突带有EOF。在这两种情况下,规则3都与规则4相冲突。

我计算出的FIRSTFOLLOW集是:

first:
   { S: Set { 'begin' },
     list: Set { 'id' },
     listPrime: Set { 'id', 'eps' } },

follow:
   { S: Set { 'EOF' },
     list: Set { 'EOF', 'id' },
     listPrime: Set { 'EOF', 'id' } } }

1 个答案:

答案 0 :(得分:1)

语法是LL(1)。您的FOLLOW集计算不正确,很容易验证:没有派生词listlistPrime后跟EOF以外的其他标记。