Bison 野牛的冲突类型

Bison 野牛的冲突类型,bison,yacc,Bison,Yacc,我想识别reduce/reduce冲突。 当两个或多个规则应用于相同的输入序列(令牌)时发生 例如: Expr:num {$$=$1}; |Expr '+' Expr;{}; |Expr '-' Expr;{}; 有谁能简单地给出一些如何识别减少/减少冲突的想法吗?好吧,你已经描述了冲突之间的区别。问题是什么 shift/reduce冲突意味着bison不知道是应该shift(读取一个终端并将其放在堆栈顶部)还是reduce(将堆栈上的多个终端/非终端转换为新的非终端)sh

我想识别
reduce/reduce
冲突。 当两个或多个规则应用于相同的输入序列(令牌)时发生

例如:

Expr:num {$$=$1};
     |Expr '+' Expr;{};
     |Expr '-' Expr;{};

有谁能简单地给出一些如何识别
减少/减少冲突的想法吗?

好吧,你已经描述了冲突之间的区别。问题是什么

shift/reduce
冲突意味着bison不知道是应该
shift
(读取一个终端并将其放在堆栈顶部)还是
reduce
(将堆栈上的多个终端/非终端转换为新的非终端)
shift/reduce
的意思是
我不知道-我应该现在应用一条规则还是稍等一下,阅读一些文本并在那里应用另一条规则?
这种冲突通常通过
shift
操作解决

reduce/reduce
冲突表示有两种或两种以上的方法可以减少堆栈顶部的终端/非终端
reduce/reduce
的意思是
我不知道-我现在应该应用这个规则还是那个规则?
。这种冲突比shift/reduce严重得多——语法模棱两可,有些地方确实错了

通常最好不要认识到reduce/reduce,而是避免它。从一开始就清楚地知道你想做什么。不时地修改你的语法。你有没有可能重新发明了另一条规则


在调试现有冲突时,
bison-v
选项会创建一个
*.output
文件,其中包含所有冲突的详细描述。第一次阅读它非常困难,需要一些关于如何进行
LR1解析的知识,但是阅读它的好处也很好。

最简单的方法是创建y.output文件

使用命令yacc-v parser\u name.y
。这将创建yacc工作方式的输出。找到yacc所说的冲突所在的州,然后了解什么是点符号是非常重要的。在文件中是指

如果输出文件显示如下内容:

Prod: proda|prodb
     proda :'x'
     prodb : 'x'
4 | Expr.'+'Expr;{};

表达式后面的点符号对你们说:“我读过Expr,输入时有“+”

减少冲突在出现以下情况时出现:

Prod: proda|prodb
     proda :'x'
     prodb : 'x'
在这种情况下,在规则末尾有Expr.时,Yacc不知道该执行哪种reduce,即reduce conflict

NON_TERMINAL1: Expr.
NON_TERMINAL2: Expr.