什么是shift/reduce conflicts?比如下面的文法就有冲突:
expr:
expr - expr
| expr * expr
| - expr
对于输入:
1 * 2
解析完1后,可以继续移进 * ,或者根据规则 expr:-expr 规约为 -1。也就是说,解析方式有两种:
-1 * 2
= (-1)*2
或者
-1 * 2
=- (1*2)
虽然结果一样,但是程序不知道该选择哪种方式。
之所以冲突,是因为移进和归约的优先级没有确定,即符号 * 和规则 expr: -expr 的优先级没有确定,出现了 * 就不知道该移进 * 还是利用规则来归约了。那么只要定义了它们的优先级,就可以解决冲突了。
参考:https://blog.csdn.net/iamagoodguy_/article/details/48499591?utm_source=copy