Javascript Jison中的调试

Javascript Jison中的调试,javascript,parsing,bison,parser-generator,jison,Javascript,Parsing,Bison,Parser Generator,Jison,我正在使用Jison编写解析器。这是我的语法: { "program": [ ["statements EOF", "return $1;"] ], "statements": [ ["statement", "$$ = $1;"], ["statements statement", "$$ = $1 + '\\n' + $2;"] ], "statement": [ [

我正在使用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
?它们分别与
表达式
数字
有何不同

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

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

表达式->表达式中的句点表示什么。什么意思

句点表示解析器的位置。因此,在该规则中,解析器将只解析两个表达式,现在处于状态9。当句点在规则末尾时,这意味着可以“减少”规则,并在本例中分组为单个
表达式
非终结符。但是,只有当下一个标记(向前看)是
换行符
数字
时,它才能减少

expression->.NUMBER
中,解析器刚刚遇到一个数字标记,它可以“移位”,然后移动到一个新状态

发生冲突的原因是,当解析器遇到
NUMBER
标记时,它可以减少或移位

编辑:要解决冲突,我们需要将该表达式规则拆分为不同的非终结符。序列中具有相同的非终端必然会产生冲突

e、 g


下面是关于这些语法类型的更多背景知识

谢谢你,扎克。是否有任何方法可以显式指定产品的关联性?我创建了一个优先级别
[“left”,“COMMA”]
,然后尝试将它设置为生产
表达式
{“prec”:“COMMA”}
。然而,这并没有起作用。你会怎么建议我重写这部作品。我希望能够键入一个字符串,例如
2 3 5 7
,并将其解析为表达式
((2 3)5)7
。我被困在这里已经有一段令人沮丧的时间了,我似乎无法集中精力解决这个问题。
{
    "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;"]
    ]
}