Есть ли LL(*) парсер, который не генерируется
Мне нужно изменить грамматические правила моего синтаксического анализатора во время выполнения, и я бы хотел избежать повторной генерации синтаксического анализатора при каждом изменении правил.
Есть ли парсер, который не использует генерацию кода?
С Уважением,
2 ответа
Вы могли бы использовать PEG (или рукописный или что-то вроде boost: spirit)
PEG не являются строгим расширенным набором грамматик LL, но, как правило, более выразительны, поскольку имеют различные дополнительные функции, такие как ограниченное отрицание и последующее контекстное тестирование.
Вы можете использовать (то есть реализовать себя, скорее всего, не библиотеку, лежащую вокруг) анализатор Earley.
Вы, конечно, заплатите за это накладные расходы. Если ваша грамматика и источник, который она анализирует, невелики, это, вероятно, будет хорошо.
В противном случае вы могли бы пересмотреть; почему вы не хотите перестраивать парсер? Большинство генераторов парсеров работают намного быстрее, чем люди могут редактировать правила.