Парсек или счастлив (с Алексом) или uu-parsinglib
Я собираюсь написать синтаксический анализатор языка verilog (или vhdl) и сделаю много манипуляций (рода преобразований) проанализированных данных. Я собираюсь проанализировать действительно большие файлы (полный дизайн Verilog, размером до 10 000 строк), и в конечном итоге я буду поддерживать большую часть Verilog. Я не против печатать, но я не хочу переписывать какую-либо часть кода всякий раз, когда добавляю поддержку какого-то другого правила.
В Haskell, какую библиотеку вы бы порекомендовали? Я знаю Haskell и раньше использовал Happy (чтобы играть). Я чувствую, что есть возможность использовать Parsec для преобразования анализируемой строки в коде (что является большим плюсом). У меня нет опыта работы с uu-paringlib.
Итак, чтобы разобрать полную грамматику verilog/VHDL, какой из них рекомендуется? Мое главное беспокойство - легкость и "правильность", с которой я могу манипулировать проанализированными данными по своей прихоти. Скорость не является главной задачей.
1 ответ
Я лично предпочитаю Parsec с помощью Алекса для лексинга.
Я предпочитаю Parsec, а не Happy, потому что 1) Parsec - это библиотека, а Happy - это программа, и вы будете писать на другом языке, если будете использовать Happy, а затем скомпилировать с Happy. 2) Parsec дает вам контекстно-зависимые возможности анализа благодаря своему монадическому интерфейсу. Вы можете использовать дополнительное состояние для контекстно-зависимого анализа, а затем проверять и принимать решения в зависимости от этого состояния. Или просто посмотрите на некоторое проанализированное значение и выберите следующие парсеры и т. Д. (Например, a <- parseSomething; if test a then ... do ...
А когда вам не нужна какая-либо контекстно-зависимая информация, вы можете просто использовать аппликативный стиль и получить реализацию, подобную реализованной в YACC или подобном инструменте.
Как недостаток Parsec, вы никогда не узнаете, содержит ли ваш анализатор Parsec левую рекурсию, и ваш синтаксический анализатор застрянет во время выполнения (потому что Parsec по сути является анализатором рекурсивного спуска сверху вниз). Вы должны найти левые рекурсии и устранить их. Синтаксические анализаторы в стиле YACC могут дать вам некоторые статические гарантии и информацию (например, сдвиг / уменьшение конфликтов, неиспользуемые терминалы и т. Д.), Которые вы не можете получить с помощью Parsec.
Алекс настоятельно рекомендуется для лексизма в обеих ситуациях (я думаю, что вы должны использовать Алекс, если вы решите продолжить с Happy). Потому что даже если вы используете Parsec, это действительно упрощает реализацию вашего синтаксического анализатора и также обнаруживает множество ошибок (например, анализ ключевого слова в качестве идентификатора был распространенной ошибкой, которую я делал, когда использовал Parsec без Алекса. Это всего лишь один пример).
Вы можете взглянуть на мой анализатор Lua, реализованный в Alex+Parsec. А вот код для использования сгенерированных Alex токенов в Parsec.
РЕДАКТИРОВАТЬ: Спасибо John L
для исправлений. По-видимому, вы также можете выполнять контекстный анализ с Happy. Кроме того, Алекс для lexing не требуется в Happy, хотя это рекомендуется.