我正在为一个非常简单的语法编写LL(1)解析器。但是,在尝试构建解析表时发现冲突。
我很惊讶,因为语法看起来很简单。我不知道解析器或对LL(1)解析的理解是否有问题。语法最后可能不是LL(1)。
语法是:
1: S -> begin list
2: list -> id listPrime
3: listPrime -> id listPrime
4: | ε
我的代码遇到两个冲突,两个冲突都派生listPrime
,一个冲突带有终端符号id
,另一个冲突带有EOF
。在这两种情况下,规则3都与规则4相冲突。
我计算出的FIRST
和FOLLOW
集是:
first:
{ S: Set { 'begin' },
list: Set { 'id' },
listPrime: Set { 'id', 'eps' } },
follow:
{ S: Set { 'EOF' },
list: Set { 'EOF', 'id' },
listPrime: Set { 'EOF', 'id' } } }
答案 0 :(得分:1)
语法是LL(1)。您的FOLLOW集计算不正确,很容易验证:没有派生词list
或listPrime
后跟EOF
以外的其他标记。