繁体   English   中英

在Jison中调试

[英]Debugging in 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 -> expression expression . 意思? 什么是.expression.NUMBER 它们与expressionNUMBER分别有何不同?

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

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

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

句点表示解析器的位置。 因此,在该规则中,解析器将刚刚解析了两个表达式,并且现在处于状态9.当句点在规则的末尾时,这意味着规则可以“减少”,并且分组为单个expression非 - 在这种情况下终止。 但是,只有当下一个标记(前瞻)是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;"]
    ]
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM