Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Он находится в общественном достоянии согласно указанным веб-страницам.

Ответ 2

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

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

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

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

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