在Jison中调试

Aad*_*hah 4 javascript parsing bison parser-generator 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;"]
    ]
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到以下错误消息:

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
Run Code Online (Sandbox Code Playgroud)

我该怎么做这个调试消息?你怎么用简单的英语解释这个消息?期间expression -> expression expression .是什么意思?什么是.expression.NUMBER?它们expression与... NUMBER分别有何不同?

use*_*701 10

我该怎么做这个调试消息?

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

表达式中的句点是什么 - >表达式表达式.意思?

句点表示解析器的位置.因此,在该规则中,解析器将刚刚解析了两个表达式,现在处于状态9.当句点位于规则的末尾时,这意味着规则可以"减少",并分组为单个expression非在这种情况下终端.但是,它只能减少下一个令牌(前瞻)是a NEWLINE还是a NUMBER.

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;"]
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的资源,可以获得有关这些类型语法的更多背景知识.