与Bison的条件和PEMDAS EBNF相互冲突/减少

时间:2018-04-21 14:06:01

标签: parsing bison ebnf

我在创建PEMDAS和条件解析时,我的Bison中有关于我的EBNF的错误。我不太清楚我将如何减少EBNF。

输出文件中有1个shift / reduce错误。这是冲突出现的部分。 " expr" in" rel_cond"当我宣布" rel_expr"时似乎有冲突。和" par_expr"规则。

cond    : rel_cond
        | par_cond
        ;

rel_cond    : expr relop cond
            | expr
            ;

par_cond    : PAR_START cond PAR_END
            ;

.
.

expr    : rel_expr
        | par_expr
        ;

par_expr    : PAR_START expr PAR_END
            ;

rel_expr    : term ADD expr 
            | term SUB expr
            | term
            ;

term    : factor MULT factor
        | factor DIV factor
        | factor
        ;


factor  : CONSTANT
        | ID
        ;

这里是.output文件中出现的内容

state 47

16 rel_cond: expr . relop expr
17         | expr .
32 par_expr: PAR_START expr . PAR_END

EQT      shift, and go to state 49
NOT_EQT  shift, and go to state 50
LT       shift, and go to state 51
GT       shift, and go to state 52
LT_EQT   shift, and go to state 53
GT_EQT   shift, and go to state 54
BIT_AND  shift, and go to state 55
LOG_AND  shift, and go to state 56
BIT_OR   shift, and go to state 57
LOG_OR   shift, and go to state 58
PAR_END  shift, and go to state 41

PAR_END  [reduce using rule 17 (rel_cond)]

relop  go to state 59

1 个答案:

答案 0 :(得分:1)

您的输出文件与您的语法不符,因此您不会在您认为自己的输入文件上运行bison。输出文件具有规则

rel_cond: expr relop expr

虽然你的规则有

rel_cond    : expr relop cond

但在任何一种情况下问题都是相同的 - 这里的规则是不明确的,因为它没有指定它是正确的还是左递归的。像

这样的输入
expr relop expr relop expr

可以解析为(expr relop expr) relop exprexpr relop (expr relop expr)。默认的“减少前移位”冲突解决意味着生成的解析器将保持递归,但您可以通过使用优先规则或通过重写语法以显式向左或向右递归来消除冲突。