Есть ли способ заставить парсек сообщать о конфликтах "сдвиг-уменьшение"?
Я играю с парсек и понял, что у меня двусмысленная грамматика. Очевидно, это ошибка с моей стороны, но я вроде как привык к генераторам синтаксических анализаторов в стиле yacc, сообщая мне, что я тупой. Парсек просто ест персонажей в том порядке, в каком вы его даете парсерам (да, я знаю о try
).
Есть ли способ заставить парсек сказать мне, когда моя грамматика не учтена? Программы, которые работают на меня, великолепны.
Спасибо!
(Я знаю, что сдвиг-уменьшение связано с другим видом технологии синтаксического анализа. Я просто хочу описать неоднозначные грамматики.)
1 ответ
Я не эксперт по Parsec, поэтому меня, скорее всего, исправят, но я не думаю, что это возможно, по той простой причине, что Parsec ничего не знает о вашей грамматике.
Или, другими словами, хотя ваша грамматика может быть неоднозначной, ваш анализатор Parsec - нет, и программа не может определить, что какое-то другое расположение комбинаторов parsec, которое создает другой вывод для эквивалентного ввода, также является допустимым представлением неопределенная грамматика.
Поскольку у вас есть грамматика, вы можете предпочесть использовать happy и alex, что даст вам гораздо больше опыта, подобного lexx/yacc.
Интересным проектом может быть адаптация BNFC для создания AST парсек-комбинаторов для представления грамматики, но я подозреваю, что это будет нетривиальной задачей.