Я пишу грамматику в 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 ')'
;
%%
Бизон говорит мне, что существует 12 конфликтов сдвига / уменьшения, но если я закомментирую строки для приращения и уменьшения постфикса, он будет работать нормально. Кто-нибудь знает, как исправить этот конфликт? На данный момент я подумываю перейти к генератору синтаксического анализатора LL (k), что делает его намного проще, но грамматики LALR всегда казались гораздо более естественными для написания. Я также рассматриваю GLR, но я не знаю ни одного хорошего генератора синтаксического анализатора C / C ++ GLR.