【问题标题】:Conflict Bison parser冲突 Bison 解析器
【发布时间】:2016-12-09 11:07:34
【问题描述】:

我是 Bison 的新手,我遇到了 shift/reduce 冲突的问题......

我正在写C语言的语法规则:ID是一个标识变量的记号,我写这个规则是为了确保标识符即使写在括号里也能被考虑。

id              : '(' ID ')'    {printf("(ID) %s\n", $2);}
                |     ID        {printf("ID %s\n", $1);}
                ;

Bison 冲突的输出是:

State 82

   12 id: '(' ID . ')'
   13   | ID .

    ')'  shift, and go to state 22

    ')'       [reduce using rule 13 (id)]
    $default  reduce using rule 13 (id)

我该如何解决这个冲突?

希望我说的很清楚,感谢您的帮助。

【问题讨论】:

  • 这是整个野牛输出吗?另外,能用英文提供吗?
  • 英文正确
  • 即使是语法,我们也需要Minimal, Complete, and Verifiable example
  • ...您只是手动翻译而不是用英语重新运行野牛吗?
  • 是的,我有意大利语版本,但它是正确的

标签: c compiler-construction bison lex


【解决方案1】:

您的id 规则本身不会导致移位/减少错误。您的语法中必须有其他使用ID 的规则。例如,您有一个表达式规则,例如:

expr: '(' expr ')'
    | ID
    ; 

在上面的示例中,ID 可以归约为 idexpr,而解析器不知道要采用哪种归约​​。检查状态 22 中的内容。


编辑:您问“我能做些什么来解决冲突?

我在写C语言的语法规则:ID是标识变量的记号,我写这个规则是为了保证标识符即使写在括号里也能被考虑

括号中作为左侧的变量在C语言中是无效的,所以它只能出现在右侧。然后您可以将其视为一个表达式,因此只需删除您的规则并将使用 id 的位置替换为 expr

【讨论】:

  • 你是对的。我有这种类型的规则,如果我评论它,我就没有更多的冲突了。这个时候我该怎么办?
  • 查看我的解决方案的编辑。如果对您有帮助,请点击左侧上/下箭头之间的零接受解决方案。
  • 你的答案是最好的。然而,在 C 中,从语法上讲,允许 (A) = (b) 做,因为编译没有错误。但我会采用你的解决方案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多