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

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

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

Спасибо!

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


person Hans    schedule 29.08.2012    source источник


Ответы (1)


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

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

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

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

person John L    schedule 29.08.2012