Jison中的调试



我使用Jison编写一个解析器。这是我的语法:

{
    "program": [
        ["statements EOF", "return $1;"]
    ],
    "statements": [
        ["statement",            "$$ = $1;"],
        ["statements statement", "$$ = $1 + '\n' + $2;"]
    ],
    "statement": [
        ["expression NEWLINE", "$$ = $1 + ';';"]
    ],
    "expression": [
        ["NUMBER",                "$$ = yytext;"],
        ["expression expression", "$$ = $1 + ', ' + $2;"]
    ]
}

然而,当我运行它时,我得到以下错误消息:

Conflict in grammar: multiple actions possible when lookahead token is NUMBER in
state 9
- reduce by rule: expression -> expression expression
- shift token (then go to state 5)
States with conflicts:
State 9
  expression -> expression expression . #lookaheads= NEWLINE NUMBER
  expression -> expression .expression
  expression -> .NUMBER
  expression -> .expression expression

我应该如何理解这个调试信息?你如何用简单的英语解释这条信息?expression -> expression expression .的周期是什么意思?.expression.NUMBER是什么?它们分别与expressionNUMBER有什么不同?

我应该如何理解这个调试信息?

语法冲突意味着解析器可能会达到这样一种状态:它可以遵循多个规则,但它没有足够的信息来确定遵循哪一个(或者更糟的是,语法是模糊的)。你必须调整语法以消除冲突。通常,这需要练习才能正确。

expression -> expression中的句号表示什么?的意思吗?

句点表示解析器的位置。因此,在该规则中,解析器只解析了两个表达式,现在处于状态9。当句点位于规则的末尾时,这意味着该规则可以"约简",并在这种情况下分组为单个expression非终结符。但是,只有当下一个令牌(forward)是NEWLINENUMBER时,它才能减少。

expression -> .NUMBER中,解析器刚刚遇到了一个NUMBER令牌,它可以"移位",然后移动到一个新的状态。

发生冲突是因为解析器在遇到NUMBER令牌时可以减少或移动。

编辑:为了解决冲突,我们需要将表达式规则拆分为不同的非终结符。在顺序上使用相同的非终结符必然会产生冲突。

{
    "program": [
        ["statements EOF", "return $1;"]
    ],
    "statements": [
        ["statement",            "$$ = $1;"],
        ["statements statement", "$$ = $1 + '\n' + $2;"]
    ],
    "statement": [
        ["expression NEWLINE", "$$ = $1 + ';';"]
    ],
    "expression": [
        ["expression expression_base", "$$ = $1 + ', ' + $2;"],
        ["expression_base", "$$ = $1;"]
    ],
    "expression_base": [
        ["NUMBER",                "$$ = yytext;"]
    ]
}

这里有一个很好的资源,可以了解这些类型语法的更多背景知识。

相关内容

  • 没有找到相关文章

最新更新