Bison 我如何解决野牛中的这种减少/减少冲突?
以下是[filename]的摘录。输出 州94Bison 我如何解决野牛中的这种减少/减少冲突?,bison,ambiguity,reduce-reduce-conflict,Bison,Ambiguity,Reduce Reduce Conflict,以下是[filename]的摘录。输出 州94 32 expr: expr . opt_at_type '.' TYPEID '(' opt_expr_list ')' 39 | expr . '+' expr 40 | expr . '-' expr 41 | expr . '*' expr 42 | expr . '/' expr 42 | expr '/' expr . 44 | expr . '&l
32 expr: expr . opt_at_type '.' TYPEID '(' opt_expr_list ')'
39 | expr . '+' expr
40 | expr . '-' expr
41 | expr . '*' expr
42 | expr . '/' expr
42 | expr '/' expr .
44 | expr . '<' expr
45 | expr . LE expr
46 | expr . '=' expr
'@' shift, and go to state 73
'.' reduce using rule 23 (opt_at_type)
'.' [reduce using rule 42 (expr)]
$default reduce using rule 42 (expr)
opt_at_type go to state 74
你能告诉我为什么会这样吗 当野牛看到以下情况时:
expr '/' expr '.'
它不知道这是否等同于:
1) expr opt_at_type '.'
或
对于1)它将首先将expr'/'expr
减少到expr
,对于2)它将首先将/*Empty*/减少到opt_at_type
所以我们发现了歧义,要解决它,你必须确定你想要的语法。一种解决方案是将第一条expr规则设置为单独的规则,以便它不能在其他表达式中使用,如:
typeexpr: expr opt_at_type '.' TYPEID '(' opt_expr_list ')'
当野牛看到以下情况时:
expr '/' expr '.'
它不知道这是否等同于:
1) expr opt_at_type '.'
或
对于1)它将首先将expr'/'expr
减少到expr
,对于2)它将首先将/*Empty*/减少到opt_at_type
所以我们发现了歧义,要解决它,你必须确定你想要的语法。一种解决方案是将第一条expr规则设置为单独的规则,以便它不能在其他表达式中使用,如:
typeexpr: expr opt_at_type '.' TYPEID '(' opt_expr_list ')'
您遇到的问题是,yacc优先级仅在解决移位/减少冲突时才考虑,而不是在减少/减少冲突时考虑。在这种情况下,
opt_at_type
规则可以匹配空字符串(可选),从而导致reduce/reduce冲突
要解决此问题,您需要取消对规则的分解以消除ε生成:
expr: expr '.' TYPEID '(' opt_expr_list ')'
| expr '@' TYPEID '.' TYPEID '(' opt_expr_list ')'
| expr '+' expr
:
没有epsilon生成,它不需要提前reduce,因此冲突会变成一个shift/reduce冲突,通常可以通过yacc优先级来解决。您遇到的问题是,yacc优先级仅在解决shift/reduce冲突时才被考虑,而不是reduce/reduce冲突。在这种情况下,
opt_at_type
规则可以匹配空字符串(可选),从而导致reduce/reduce冲突
要解决此问题,您需要取消对规则的分解以消除ε生成:
expr: expr '.' TYPEID '(' opt_expr_list ')'
| expr '@' TYPEID '.' TYPEID '(' opt_expr_list ')'
| expr '+' expr
:
如果没有epsilon产生式,则不需要提前reduce,因此冲突会变成shift/reduce冲突,通常可以通过yacc优先级来解决