Лимонная сила или нет? - PullRequest
       41

Лимонная сила или нет?

18 голосов
/ 24 декабря 2010

Для грамматического парсера я "играл" с Бизоном , у которого есть свои плюсы / минусы.

На прошлой неделе на сайте SqLite я заметил, что двигатель работает с другим грамматическим парсером: Lemon

Звучит отлично после прочтения тонкой документации.
Есть ли у вас отзывы об этом парсере?

Невозможно увидеть соответствующую информацию в Google и Википедии (всего несколько примеров, те же учебные пособия). Кажется, она не очень популярна. (в переполнении стека нет тега [ed: теперь есть: P])

Ответы [ 2 ]

19 голосов
/ 19 февраля 2011

Причины, по которым мы используем Lemon в нашем проекте прошивки:

  • Небольшой размер сгенерированного кода и объем памяти.Он производит самый маленький из найденных мной анализаторов (я сравнил парсеры аналогичной сложности, сгенерированные с помощью flex, bison, ANTLR и Lemon);
  • Отличная поддержка встроенных систем: Lemon не зависит от стандартной библиотеки, вы можете указатьфункции управления внешней памятью, ведение журнала отладки является съемным.
  • Лицензия на общественное достояние.Существует отдельная ветка Lemon, лицензированная по GPLv2, которая не подходит для наших нужд из-за вирусной лицензии.Таким образом, мы получаем последние исходники sqlite и скомпилируем из них Lemon (он состоит только из двух файлов);
  • Разбор по запросу.Это делает код более простым для понимания и поддержки, чем код синтаксического анализа Flex / Bison.Потокобезопасность как дополнительный бонус, которым я восхищаюсь.
  • Простая интеграция с токенизаторами.Природа нашего проекта требует токенизации двоичного потока с переменным размером токенов.Это был довольно простой в реализации токенизатор, который интегрировался с API синтаксического анализатора всего из 3 функций и одной переменной контекста обратной связи.Мы исследовали способы интеграции Lemon с re2c и Ragel и обнаружили, что они также довольно просты в реализации.
  • Очень простой синтаксис, быстрый для изучения.
  • Lemon явно разделяет разработку токенизатора и лексического анализатора (анализатора),Мой процесс разработки начинается с разработки грамматики парсера.На этом первом этапе я могу проверить сложные правила с неявной последовательностью токенов с помощью нескольких вызовов Parser (...).Токенизатор внедряется впоследствии.

Конечно, Лимон не является серебряной пулей, он имеет ограниченную область применения.Среди недостатков:

  • Лимон требует написать больше правил по сравнению с Bison из-за упрощенного синтаксиса: нет повторений и опций, одно действие на правило и т. Д.
  • Полный набор LALR (1) ограничения синтаксического анализатора.
  • Только язык C.

Взвесьте все за и против, прежде чем сделать свой выбор.Я сделал мой; -)

6 голосов
/ 26 декабря 2010

Интересная находка!На самом деле я не использовал его, поэтому комментарии основаны на прочтении документации.

Редизайн, так что лексический анализ выполняется отдельно от синтаксического анализа, сразу же кажется полезным.В частности, он может упростить такие операции, как обработка нескольких или вложенных исходных файлов.Механизм yywrap() на базе Lex не идеален.То, что он избегает всех глобальных переменных и имеет тщательное выделение памяти, и контроль освобождения должен рассчитывать в его пользу (то, что он позволяет выбор распределителя и освобождения, тоже очень помогает - по крайней мере, для сред, в которых я работаю, где распределение памяти всегда является проблемой).

Хорошей идеей является переосмысление того, как организованы правила и как идентифицируются терминалы.

В целом, это выглядит как хорошо продуманный редизайн Bison.

Находится в свободном доступе в соответствии с указанными веб-страницами.

...