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 パーサー ジェネレーターを知りません。