Конфликты в написании парсера с Bison - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь написать парсер с Bison.Я получаю предупреждение:

 warning: 5 shift/reduce conflicts [-Wconflicts-sr]

Мои правила:

%%
Prog    :   F {};
F   :    {};
F   :   D F {};
D   :   R ID LP Fr RP LB Ss RB {};
R   :   T {};
R   :   VOID {};
Fr  :    {};
Fr  :   Fl {};
Fl  :   Fd COM Fl1 {};
Fl1 :   | Fl1 Fd COM {};
Fd  :   T ID Fd1{};
Fd1 :   LB NUM BM RB{};
BM  :   B | {};
Ss  :   S | Ss S {};
S   :   LB Ss RB {};
S   :   T ID SC {};
S   :   T ID ASGN E SC {};
S   :   T ID LB NUM RB SC {};
S   :   T ID LB NUM B RB SC {};
S   :   ID ASGN E SC {};
S   :   ID LB E RB ASGN E SC {};
S   :   C SC {};
S   :   RET SC {};
S   :   RET E SC {};
S   :   IF LP E RP S {};
S   :   WHILE LP El RP S {};
S   :   BREAK SC {};
C       :   ID LP ElM RP {};
ElM :   El | {};
El  :   E El1{};
El1 :   | COM El {};
T   :   INT | BYTE | BOOL {};
E       :   LP E RP | ID LB E RP |ID | C | NUM | NUM B | STR | TRUE | FALSE |   NOT E | E Op E {};
Op      :   AND | OR | RLP | BNP {};
%%

Как узнать, где конфликты?Я пытался объединить правила, но количество конфликтов никогда не менялось.В чем может быть причина?

1 Ответ

0 голосов
/ 20 мая 2018

Опция -v для bison заставляет bison создавать файл y.output (на самом деле он называется what.output, где 'what' - базовое имя вашего входного файла, если вы не используете совместимость с yacc).

Файл y.output содержит полную сводку синтаксического анализатора, сгенерированного из вашей грамматики - все правила, все состояния синтаксического анализатора и все действия в состояниях.Он также определяет, какие состояния содержат все конфликты и как эти конфликты были разрешены для создания синтаксического анализатора.

...