为什么我的三元运算符会导致移位减少冲突



以下是我的语法:

arithmetic_expression : expression + expression
                      | expression - expression
expression            : constant
                      | ID
                      | arithmetic_expression
                      | ternary
ternary               : expression ? expression : expression

在这种状态下,我收到一个减班错误:

state 126
    (19) ternary -> expression QUESTION_MARK expression COLON expression .
    (27) arithmetic_exp -> expression . PLUS expression
    (28) arithmetic_exp -> expression . MINUS expression
    (19) ternary -> expression . QUESTION_MARK expression COLON expression
  ! shift/reduce conflict for PLUS resolved as shift
  ! shift/reduce conflict for MINUS resolved as shift
  ! shift/reduce conflict for QUESTION_MARK resolved as shift
    PLUS            shift and go to state 86
    MINUS           shift and go to state 88
    QUESTION_MARK   shift and go to state 85
  ! PLUS            [ reduce using rule 19 (ternary -> expression QUESTION_MARK expression COLON expression .) ]
  ! MINUS           [ reduce using rule 19 (ternary -> expression QUESTION_MARK expression COLON expression .) ]
  ! QUESTION_MARK   [ reduce using rule 19 (ternary -> expression QUESTION_MARK expression COLON expression .) ]

我认为冲突在于

true ? 1 : false ? 3 : 2

可以被解释为CCD_ 1或CCD_。

我已经将+-的优先级设置为左关联,并且级别高于?(我将其设置为右关联)。

我做错了什么?

如果我理解正确,您做了以下操作:

%left '+' '-'
%right '?'
%%
arithmetic_expression : expression + expression
                      | expression - expression
                      ;
ternary               : expression ? expression : expression
                      ;

这是行不通的,因为你还没有告诉野牛ternary生产的优先级是什么

为了解决转移-减少冲突,bison将可能减少的生产的优先级与可能转移的终端的优先级进行比较。您已经声明了端子"+"、"-"one_answers"?"的优先级,以及arithmetic_expression中两个产生的优先级,但不包括ternary中产生的优先级。

引用野牛手册,强调:

每个规则的优先级来自组件中提到的最后一个终端符号。

这很微妙,你不会是第一个没有注意到的人。

解决方案:要么声明终端:的优先级,要么将true ? 1 : (false ? 3 : 2)0添加到ternary中的生产中。

Exaclty-您没有指定关联性。

在C中,语法上写着:

conditional_expression = logical_or_expression [ '?' expression ':' conditional_expression ];

所以我相信你想要像这样的东西

conditional_expression = arithmetic_expression [ '?' expression ':' conditional_expression ];

如果您想要类似C的行为(以及正确的关联性和其他特性)。

相关内容

  • 没有找到相关文章

最新更新