Бизон пожаловался на «конфликты: 1 смена / уменьшение» - PullRequest
2 голосов
/ 01 ноября 2011

Бизон пожаловался на «конфликты: 1 смена / уменьшение». Я не вижу, что не так. Пожалуйста помоги. Спасибо,

%token OR AND NUMBER
%%

search_condition:
        |       search_condition AND search_condition { printf(" AND "); }
        |       '(' search_condition ')'
        |       predicate
        ;

predicate:
                NUMBER { printf("%d\n", $1);  }
        ;

1 Ответ

9 голосов
/ 01 ноября 2011

Конфликт означает, что грамматика, которую вы дали зубру, не является LALR (1), поэтому он не может решить, какое действие предпринять в каждом возможном случае, чтобы правильно проанализировать грамматику.

В вашемВ этом случае проблема в том, что ваша грамматика неоднозначна.Если вы дадите ему ввод типа

NUMBER AND NUMBER AND NUMBER

, он не сможет решить, должен ли он анализировать его как эквивалент

( NUMBER AND NUMBER ) AND NUMBER

или

NUMBER AND ( NUMBER AND NUMBER )

.Вы можете решить эту проблему несколькими способами:

  • вы можете использовать %left AND или %right AND, чтобы сказать зубру, что он должен обрабатывать AND как левый или право-ассоциативный инфиксоператор

  • вы можете изменить правило search_condition, чтобы сделать его однозначным:

    search_condition : search_condition AND primary
                     | primary
                     ;
    primary : '( search_condition ')'
            | predicate
            ;
    
...