警告:2减少/减少yacc语法中的冲突[-Wconflicts rr]

警告:2减少/减少yacc语法中的冲突[-Wconflicts rr],c,parsing,bison,yacc,C,Parsing,Bison,Yacc,我有以下yacc语法: 我认为这将使|+部分成为可能。但是我得到了一个reduce/reduce冲突,由于以下几行: | assignments ',' declaration_expression | id_list ',' declaration_expression 我做错了什么?如果我理解正确,您希望在var声明中混合使用裸变量名和变量初始化,而在const声明中只允许初始化。这很直截了当: initialization : ID '=' value init_list

我有以下yacc语法:

我认为这将使|+部分成为可能。但是我得到了一个reduce/reduce冲突,由于以下几行:

    | assignments ',' declaration_expression
    | id_list ',' declaration_expression

我做错了什么?

如果我理解正确,您希望在var声明中混合使用裸变量名和变量初始化,而在const声明中只允许初始化。这很直截了当:

initialization : ID '=' value
init_list      : initialization | init_list ',' initialization
init_or_id     : initialization | ID
init_or_id_list: init_or_id
               | init_or_id_list ',' init_or_id

const_declaration: CONST ':' type init_list
var_declaration  : VAR   ':' type init_or_id_list
您所做的错误是通过使用列表而不是项目扩展混合列表来创建混合列表。这是不明确的,因此会导致reduce/reduce冲突

上面的工作原理与您的原始工作原理相同,因为init_list和init_或_id_list永远不能在派生中的同一点显示为非终端。其中一个明确跟随const关键字,另一个明确跟随var关键字。这是幸运的,因为一个纯赋值列表可以满足两个产品,如果它们共享一个上下文,就会产生reduce/reduce冲突。这个问题也是可以解决的,因为它偶尔会出现,我将添加解决方案,尽管我强调它与这个特定问题无关。不过,这可能与后来的一些读者有类似的问题有关

为了使这两个可能的列表语法明确,有必要确保潜在的纯赋值列表始终是从混合列表派生出的不同产品。所以我们可以写:

init_list: initialization | init_list initialization
init_or_id_list: ID
               | init_list ',' ID
               | init_or_id_list ',' init_or_id
现在,一个init_或_id_列表必须至少包含一个id项,所以不能将其与init_列表混淆。但现在我们使用最终结果,我们需要记住,接受混合列表的上下文需要允许两种列表可能性:

pure_list: init_list
mixed_list: init_list | init_or_id_list

我认为您的第一个代码片段是在非工作修改之后。如果您仍然有可用的版本,这将很有帮助。@rici这是最后一个可用的版本。但是,它只支持形式为:var:|的变量声明。它不允许混合变量名和初始化。我想这就是它的样子,但我不确定。谢谢不过,为了清晰起见,最好编辑您的问题。我使用了声明表达式的这个定义:from pastebin,但我想修改它,使var声明可以是一个混合项列表,可以是id或赋值。所以我把它改为:从当前的问题,这给了我减少/减少冲突。。
initialization : ID '=' value
init_list      : initialization | init_list ',' initialization
init_or_id     : initialization | ID
init_or_id_list: init_or_id
               | init_or_id_list ',' init_or_id

const_declaration: CONST ':' type init_list
var_declaration  : VAR   ':' type init_or_id_list
init_list: initialization | init_list initialization
init_or_id_list: ID
               | init_list ',' ID
               | init_or_id_list ',' init_or_id
pure_list: init_list
mixed_list: init_list | init_or_id_list