野牛:减少/减少冲突

时间:2014-10-16 18:03:10

标签: c++ bison bisonc++

我在野牛中编写SQL编译器并且无法解释状态机野牛的生产。以下是两个状态,每个状态导致1 reduce/reduce错误。

我猜测not_qm导致这些reduce/recude like_condin_cond中的like_cond : scalar_exp not_qm LIKE scalar_exp escape_scalar_exp_qm ; in_cond : row_constructor not_qm IN LPAREN table_exp RPAREN | scalar_exp not_qm IN LPAREN scalar_exp_list RPAREN ; not_qm : /* empty */ | NOT ; ### EDITTED SECTION row_constructor : scalar_exp | LPAREN scalar_exp_list RPAREN ; scalar_exp : un_op_qm scalar_primary | scalar_exp bin_op scalar_primary ; ### State 193 35 like_cond: scalar_exp . not_qm LIKE scalar_exp escape_scalar_exp_qm 37 in_cond: scalar_exp . not_qm IN LPAREN scalar_exp_list RPAREN 75 row_constructor: scalar_exp . 78 scalar_exp: scalar_exp . bin_op scalar_primary STAR shift, and go to state 59 NOT shift, and go to state 218 PLUS shift, and go to state 60 MINUS shift, and go to state 61 DIV shift, and go to state 62 CONCAT shift, and go to state 63 NOT [reduce using rule 75 (row_constructor)] LIKE reduce using rule 148 (not_qm) IN reduce using rule 75 (row_constructor) IN [reduce using rule 148 (not_qm)] $default reduce using rule 75 (row_constructor) bin_op go to state 64 not_qm go to state 228 State 211 35 like_cond: scalar_exp . not_qm LIKE scalar_exp escape_scalar_exp_qm 37 in_cond: scalar_exp . not_qm IN LPAREN scalar_exp_list RPAREN 75 row_constructor: scalar_exp . 78 scalar_exp: scalar_exp . bin_op scalar_primary 123 scalar_exp_list: scalar_exp . scalar_exp_list_star STAR shift, and go to state 59 NOT shift, and go to state 218 PLUS shift, and go to state 60 MINUS shift, and go to state 61 DIV shift, and go to state 62 CONCAT shift, and go to state 63 COMMA shift, and go to state 109 RPAREN reduce using rule 124 (scalar_exp_list_star) NOT [reduce using rule 75 (row_constructor)] LIKE reduce using rule 148 (not_qm) IN reduce using rule 75 (row_constructor) IN [reduce using rule 148 (not_qm)] $default reduce using rule 75 (row_constructor) bin_op go to state 64 scalar_exp_list_star go to state 110 not_qm go to state 228 (见下面的代码)。

我希望有人能指出我正确的方向。如果还需要更多信息,请与我们联系。

{{1}}

1 个答案:

答案 0 :(得分:0)

问题在于这3条规则:

1)row_constructor not_qm IN LPAREN table_exp RPAREN
2)scalar_exp not_qm IN LPAREN scalar_exp_list RPAREN
3)row_constructor     : scalar_exp

如果堆栈中的最后一个元素是scalar_exp并且下一个标记是IN,那么看看会发生什么: 它可以将空字符串减少到not_qm,以便堆栈变为scalar_exp, not_qm,或者可以将scalar_exp减少到row_constructor。这是因为bison生成了一个LALR(1)解析器,所以它只根据堆栈的顶部元素和下一个标记做出决定。这就是为什么它在这一点上无法区分1)2)规则的原因,尽管它们不同。所以你需要改变你的语法,使其成为LALR(1) - 可分解的。