【发布时间】:2014-04-07 15:03:37
【问题描述】:
我必须编写某种解析器,使用 yacc 和 bison 等工具非常容易。但我有以下问题:
NotRec: /*empty*/
| NotRec T_NOT
| NotRec T_MINUS
;
Expr:
| Term /*1*/
| NotRec Term /*2*/
;
规则 1 和 2 有什么区别?
在我看来NotRec 可以为空(因为它有一个空分支),因此Term 应该与NotRec Term 相同。但如果我删除第一条规则,我会得到不同的结果!
【问题讨论】:
-
有什么不同的结果?对于第一条规则,语法是模棱两可的,bison 应该警告您存在移位/归约冲突。
-
不,我没有遇到野牛错误。但是解析器(bison-result)接受不同的输入......
-
我收到了来自野牛的 shift/reduce 警告。也许有一些你没有提到的东西。请提供一个更完整的例子;见stackoverflow.com/help/mcve
-
您没有显示
Term的规则,所以这有点推测,但您的规则 1 允许使用Term的单项表达式,仅此而已,而规则2 允许Term前面有NotRec,这似乎是T_NOT和T_MINUS项的可能空序列。此外,正如@rici 所提到的,存在一些歧义(最明显的一个是空字符串可以表示NotRec或Expr)...
标签: grammar bison yacc parser-generator