Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bison 我如何解决野牛中的这种减少/减少冲突?_Bison_Ambiguity_Reduce Reduce Conflict - Fatal编程技术网

Bison 我如何解决野牛中的这种减少/减少冲突?

Bison 我如何解决野牛中的这种减少/减少冲突?,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

以下是[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 . '<' 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优先级来解决