首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Jison中调试

在Jison中调试
EN

Stack Overflow用户
提问于 2013-04-05 11:02:24
回答 1查看 966关注 0票数 4

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

代码语言:javascript
复制
{
    "program": [
        ["statements EOF", "return $1;"]
    ],
    "statements": [
        ["statement",            "$$ = $1;"],
        ["statements statement", "$$ = $1 + '\\n' + $2;"]
    ],
    "statement": [
        ["expression NEWLINE", "$$ = $1 + ';';"]
    ],
    "expression": [
        ["NUMBER",                "$$ = yytext;"],
        ["expression expression", "$$ = $1 + ', ' + $2;"]
    ]
}

但是,当我运行它时,我得到了以下错误消息:

代码语言:javascript
复制
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有什么不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-05 16:21:11

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

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

expression -> expression表达式中的句号是什么。卑劣?

句点表示解析器的位置。因此,在该规则中,解析器刚刚解析了两个表达式,现在处于状态9。当句号在规则的末尾时,这意味着规则可以“缩减”,并在本例中分组为一个expression非终结符。但是,只有当下一个令牌(前视)是NEWLINENUMBER时,它才能减少。

expression -> .NUMBER中,解析器刚刚遇到了一个数字令牌,它可以对其进行“移位”,然后转换到一个新状态。

之所以会发生冲突,是因为解析器在遇到NUMBER标记时可能会减少或转移。

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

例如:

代码语言:javascript
复制
{
    "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;"]
    ]
}

这里有一个nice resource,了解这些类型的语法的更多背景知识。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15825195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档