Есть ли способ заставить парсек сообщать о конфликтах "сдвиг-уменьшение"?

Я играю с парсек и понял, что у меня двусмысленная грамматика. Очевидно, это ошибка с моей стороны, но я вроде как привык к генераторам синтаксических анализаторов в стиле yacc, сообщая мне, что я тупой. Парсек просто ест персонажей в том порядке, в каком вы его даете парсерам (да, я знаю о try).

Есть ли способ заставить парсек сказать мне, когда моя грамматика не учтена? Программы, которые работают на меня, великолепны.

Спасибо!

(Я знаю, что сдвиг-уменьшение связано с другим видом технологии синтаксического анализа. Я просто хочу описать неоднозначные грамматики.)

1 ответ

Решение

Я не эксперт по Parsec, поэтому меня, скорее всего, исправят, но я не думаю, что это возможно, по той простой причине, что Parsec ничего не знает о вашей грамматике.

Или, другими словами, хотя ваша грамматика может быть неоднозначной, ваш анализатор Parsec - нет, и программа не может определить, что какое-то другое расположение комбинаторов parsec, которое создает другой вывод для эквивалентного ввода, также является допустимым представлением неопределенная грамматика.

Поскольку у вас есть грамматика, вы можете предпочесть использовать happy и alex, что даст вам гораздо больше опыта, подобного lexx/yacc.

Интересным проектом может быть адаптация BNFC для создания AST парсек-комбинаторов для представления грамматики, но я подозреваю, что это будет нетривиальной задачей.

Другие вопросы по тегам