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.