关于移进/规约冲突(shift/reduce conflicts)

什么是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 

猜你喜欢

转载自blog.csdn.net/raylrnd/article/details/82817126