Лимонная сила или нет?
Для грамматического анализатора я использовал "играть" с Bison, у которого есть свои плюсы/минусы.
На прошлой неделе я заметил на сайте SqLite, что движок работает с другим парсером грамматики: Лимон
Звучит здорово после прочтения тонкой документации.
У вас есть отзывы об этом парсере?
Невозможно увидеть соответствующую информацию о Google и Википедии (всего несколько примеров, те же уроки). Это не кажется очень популярным. (нет lemon в переполнении стека [ed: есть теперь: P])
Ответы
Ответ 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.
Взвесьте плюсы и минусы, прежде чем делать свой выбор. Я сделал свой, -)