【问题标题】:LL(1) parsing conflictLL(1) 解析冲突
【发布时间】:2019-01-02 22:55:01
【问题描述】:

我正在为一个非常简单的语法编写一个 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' } } }

【问题讨论】:

    标签: parsing ll


    【解决方案1】:

    语法是LL(1)。您的 FOLLOW 集计算不正确,这很容易验证:没有推导在其中 listlistPrime 后跟 EOF 以外的标记。

    【讨论】:

    • 非常感谢!在意识到 FOLLOW 是错误的之后,我被困在了这里,我能够快速修复错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多