В чем преимущество использования генератора синтаксических анализаторов вроде happy по сравнению с использованием комбинаторов синтаксического анализа? - PullRequest
27 голосов
/ 01 сентября 2011

Чтобы научиться писать и разбирать контекстную грамматику, я хочу выбрать инструмент.Для Haskell есть два больших варианта: Happy, который генерирует парсер из описания грамматики, и * Parsec, который позволяет напрямую кодировать парсер в Haskell.

Каковы (не) преимущества любого подхода

Ответы [ 5 ]

23 голосов
/ 01 сентября 2011

Внешний против внутреннего DSL

Формат спецификации синтаксического анализатора для Happy - это внешний DSL, в то время как с Parsec у вас есть полная мощность Haskell, доступная при определении ваших анализаторов.Это означает, что вы можете, например, написать функции для генерации парсеров, использовать Template Haskell и так далее.

Правила приоритетов

В Happy вы можете использовать предшественников , чтобы упростить вашу грамматику, в то время как в Parsec вы должны правильно вложить правила грамматики самостоятельно,Поэтому изменение приоритета оператора в Parsec гораздо более утомительно.

Статическая проверка

Happy предупредит вас о неясностях в вашей грамматике во время компиляции.(Хотя не очень хорошо сообщать вам , где они .) С Parsec вы не получите предупреждения, пока ваш парсер не выйдет из строя во время выполнения.

4 голосов
/ 01 сентября 2011

Это традиционное решение: использовать ли lex / yacc (счастливый) или написать свой собственный (в основном рекурсивный) синтаксический анализатор, только для того, чтобы библиотека parsec была похожа на DSL для правильной работы.

Если у вас есть опыт работы с подходом yacc / lex, использование happy будет меньшей кривой обучения.

1 голос
/ 12 сентября 2011

Я привык к библиотеке комбинатора синтаксических анализаторов uu-parsinglib из Университета Утрехта.Можно бесплатно исправить ошибки и перестановки, а также то, что есть в parsec.Мне также нравится это, потому что моя реализованная грамматика выглядит как грамматика EBNF, без большого количества монадических вещей, и легко читается.

1 голос
/ 01 сентября 2011

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

0 голосов
/ 09 августа 2012

Наивные комбинаторы синтаксического анализатора не разрешают левую рекурсию в грамматических правилах, и я не нашел библиотеку, которая делает.

Happy допускает полный BNF в спецификации языка и некоторых полезных сотрудников, таких как правила приоритета. Так что для сложных случаев генераторы Happy и парсера в целом намного лучше. Однако в случае простых, глупых языков с разбираемыми грамматиками LL (k) я бы использовал библиотеку синтаксических анализаторов как более удобную для сопровождения.

...