Коко / Р против ANTLR

Я оцениваю использование Coco/R и ANTLR для использования в проекте C# как часть того, что по сути является функцией слияния с возможностью написания сценариев. Для разбора (простых) скриптов мне понадобится парсер.

Я сосредоточился на Coco/R и ANTLR, потому что оба кажутся достаточно зрелыми, ухоженными и способны генерировать достойные парсеры C#.

Однако ни тот, ни другой не кажутся тривиальными в использовании, и я бы оценил простоту, особенно тех, кто их обслуживает.

У кого-нибудь есть какие-либо рекомендации? Каковы плюсы / минусы либо для синтаксического анализа небольшого языка - или я полностью изучаю неправильные вещи? Насколько хорошо они интегрируются в типичную установку непрерывной интеграции? Какие подводные камни?

По теме: Ну, много вопросов, таких как 1, 2, 3, 4, 5.

4 ответа

Решение

Если вы просто объединяете данные в сложный шаблон, рассмотрите движок Terence Parr StringTemplate. Он человек, стоящий за ANTLR. StringTemplate может лучше подходить и проще в использовании, чем генератор полного синтаксического анализатора. Это очень многофункциональный шаблонизатор.

В загрузках доступен порт C#.

Мы использовали Coco в течение 2 лет, заменив Antler, который мы использовали ранее. Для типичного запроса больших данных (нашего приложения) наш опыт таков. Предостережение: мы зависим от полной обработки Utf-8, с парсером, реализованным в C++. Эти цифры для языка, который имеет около 200 произведений EBNF.

  • Antler: 260 usecs / query и объем памяти 108 MEGABYTE для сгенерированного парсера / лексера
  • Coco: 220 usecs/query и 70 КБайт памяти, занимаемая для анализатора / сканера

Первоначально у Coco было время запуска 1,2 мсек, и было сгенерировано несколько таблиц по 60 KBYTE для отображения Utf-8. Мы сделали много локальных улучшений в Coco, таких как устранение больших таблиц, устранение времени запуска в 1,2 мс, значительно улучшенная внутренняя документация (а также документация в сгенерированном коде).

Наша версия Coco (с открытым исходным кодом) имеет крошечную площадь по сравнению с Antlr и очень заметно быстрее, не имеет задержки при запуске и просто... работает. У него нет приятного пользовательского интерфейса Antler, но это никогда не приходило нам в голову, когда мы начали использовать Coco.

ANTLR - это LL(*), такой же мощный, как и PEG, но обычно гораздо более эффективный и гибкий. LL(*) вырождается в LL(k) при k>1, в любом произвольном прогнозе нет необходимости.

По сути, coco/r генерирует парсеры рекурсивного спуска и поддерживает только грамматики LL(1), тогда как ANTLR использует обратное отслеживание (среди других методов), что позволяет ему обрабатывать более сложные грамматики. синтаксические анализаторы coco / r гораздо более легки и их легче понять и развернуть, но иногда трудно получить грамматику в форме, понятной coco / r, с учетом одного ограничения на просмотр - для многих распространенных грамматик языка программирования (например, C++, SQL), это невозможно вообще.

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