Зубр: уменьшить / уменьшить конфликт

Я пишу компилятор SQL на зубре и испытываю затруднения при интерпретации процесса создания зубра конечным автоматом. Ниже приведены два состояния, каждое из которых вызывает 1 reduce/reduce ошибка.

Я угадываю not_qm вызывает эти reduce/recude в like_cond а также in_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

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) -разборной.

0

Другие решения