Javascript Jison中的调试
我正在使用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": [ [
{
"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;"]
]
}