Меня смущает следующая цитата из Википедии:
Другими словами, если язык был достаточно разумным, чтобы позволить эффективный однопроходный синтаксический анализатор, он мог быть описан грамматикой LR (k). И эту грамматику всегда можно было механически преобразовать в эквивалентную (но более крупную) грамматику LR (1). Таким образом, метод синтаксического анализа LR (1) теоретически был достаточно мощным, чтобы обрабатывать любой разумный язык. На практике естественная грамматика для многих языков программирования близка к LR (1).
Это означает, что генератор синтаксического анализатора, такой как bison
, очень мощный (поскольку он может обрабатывать LR(k)
грамматики), если можно преобразовать грамматику LR(k)
в грамматику LR(1)
. Существуют ли примеры этого или рецепт, как это сделать? Я хотел бы знать это, поскольку у меня есть конфликт сдвига / уменьшения в моей грамматике, но я думаю, что это потому, что это LR(2)
грамматика, и я хотел бы преобразовать ее в LR(1)
грамматику. Дополнительный вопрос: C++
необоснованный язык, поскольку я читал, что созданные bison
парсеры не могут его проанализировать.