Byacc Conflicts - PullRequest
       23

Byacc Conflicts

0 голосов
/ 11 апреля 2011

Я создаю программу byacc для анализа некоторых входных данных, и у меня возникают проблемы с разрешением конфликтов сдвига / уменьшения. В таком случае, как я могу сказать byac всегда сдвигать?

    53: shift/reduce conflict (shift 49, reduce 36) on '('
    53: shift/reduce conflict (shift 50, reduce 36) on '['
    53: shift/reduce conflict (shift 51, reduce 36) on '{'
    state 53
        body : start_section . section end_section  (32)
        body : start_section . section  (33)
        body : start_section .  (36)
        body : start_section . end_section  (38)

Спасибо!

1 Ответ

2 голосов
/ 14 апреля 2011

Существует два типа конфликтов: уменьшение / уменьшение и сдвиг / уменьшение. Когда возникает какой-либо конфликт, это потому, что создаваемая вами грамматика неоднозначна. Ваш сдвиг / уменьшение появляется потому, что Бьяк не знает, следует ли ему уменьшить правило «тело» и перейти в состояние 36 (, например «Я нашел это правило, введите данные для следующего!» ) ИЛИ если он сместит (потребит / примет) другой токен и продолжит поиск правила для принятия ( вроде "Я не нашел полное правило, но предоставлю больше информации, возможно, тогда я ).

Byacc всегда создает однозначный синтаксический синтаксический анализатор. Как? Когда возникает конфликт (сомнение), он просто выбирает его. Который из? Для уменьшения / уменьшения он выбирает первый, который появится в файле. Для сдвига / уменьшения по умолчанию всегда выбирается смещение. Так что ... по умолчанию вы получите желаемое поведение.

Тем не менее, это хорошая идея иметь однозначную грамматику. Для этого вам придется разрешить конфликт. Это означает, что вам нужно найти способ избежать этой нерешительности Бьякка. Я надеюсь, что кто-то еще может помочь вам с этим, я не эксперт. Я знаю, что вы можете достичь этого, уменьшив количество правил и удалив пустые правила, такие как:

A:            /* empty */
 | a
 ;
...