Я пишу грамматику в YACC (на самом деле Bison), и у меня проблема со сдвигом / уменьшением. Это результат включения постфиксных операторов инкремента и декремента. Вот урезанная версия грамматики:
%token NUMBER ID INC DEC
%left '+' '-'
%left '*' '/'
%right PREINC
%left POSTINC
%%
expr: NUMBER
| ID
| expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| INC expr %prec PREINC
| DEC expr %prec PREINC
| expr INC %prec POSTINC
| expr DEC %prec POSTINC
| '(' expr ')'
;
%%
Bison сообщает мне, что существует 12 конфликтов сдвига / уменьшения, но если я закомментирую строки для увеличения и уменьшения постфикса, он работает нормально. Кто-нибудь знает, как исправить этот конфликт? На этом этапе я подумываю о переходе на генератор синтаксического анализатора LL (k), который значительно упрощает его, но грамматики LALR всегда казались более естественными для написания. Я тоже рассматриваю GLR, но не знаю хороших генераторов синтаксического анализатора C / C ++ GLR.