2014-10-16 3 views
0

Я пишу SQL-компилятор в бизоне и затрудняюсь интерпретировать производство бизонов государственного аппарата. Ниже приведены два состояния, каждый из которых вызывает ошибку 1 reduce/reduce.Bison: уменьшить/уменьшить конфликт

Я предполагаю, что not_qm является причиной этих reduce/recude «S в 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

Не могли бы вы показать правила, которые вы используете для 'scalar_exp' и' row_constructor'? – kraskevich

+0

Я добавил их в мой пост – Wouter

ответ

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) -parsable.

+0

Спасибо, что помог мне. Таким образом, проблема заключается в создании бизонов парсером, который использует внешний вид размера 1? Я применил свою грамматику как ЛАЛР (1), и конфликты сокращения/уменьшения исчезли. – Wouter

+0

@Wouter Да, он использует парсинг LALR (1), потому что этот тип анализатора более эффективен с точки зрения использования времени и памяти. – kraskevich

Смежные вопросы