Это, безусловно, правильный анализ этого конфликта сдвига-уменьшения. Грамматика однозначна, но LALR (2).
Существует механическая процедура для построения грамматики LALR (1) из грамматики, которая является LALR ( k ), и она может быть применена к этому примеру. Но я не написал это, потому что это довольно долго, и я сомневаюсь, что это действительно полезно. Я подозреваю, что оригинальная грамматика была больше похожа на
statement
: return_statement
| expr_statement
| ...
return_statement
: "return" expression
| "return"
expression_statement
: expression '!'
, где X
был заменен нетерминалом, который может выводить фразы неограниченной длины. В результате эта грамматика не является LALR ( k ) для любого k . Но это все еще однозначно.
Таким образом, ваш лучший вариант - попросить Bison сгенерировать синтаксический анализатор GLR, который может обрабатывать произвольные однозначные грамматики. Если вы используете бизона, а конфликтующие состояния возникают на практике редко, то издержки GLR очень малы, поскольку бизон оптимизирует GLR для детерминированных c состояний.