RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.
Генератор анализатора Lemon LALR(1)

1. Обзор

Языковой анализатор SQL для SQLite произведен, используя программу генератора кода под названием "Lemon". Lemon читает грамматику входного языка и выдает C-код, чтобы осуществить анализатор для того языка.

1.1. Исходные файлы и документация

Lemon не имеет своего собственного репозитария. does not have its own source repository. Lemon состоит из нескольких файлов в исходном дереве SQLite:

  • lemon.html → оригинальная подробная документация использования и ссылки для программистов для Lemon.

  • lemon.c → исходный код для утилиты, которая читает файл грамматики и производит соответствующий C-код анализатора.

  • lempar.c → шаблон для произведенного C-кода анализатора. Утилита "lemon" читает этот шаблон и вводит дополнительный код, чтобы произвести анализатор.

2. Преимущества Lemon

Lemon производит LALR (1) анализатор. Его действие подобно более знакомым инструментам Yacc и Bison, но Lemon добавляет важные улучшения, включая:

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

  • В Lemon токенизатор вызывает анализатор. Yacc действует наоборот с анализатором, вызывая токенизатор. Лимонный подход поточно-безопасен, тогда как Yacc использует глобальные переменные. Повторная входимость особенно важна для SQLite, так как некоторые SQL-операторы сделали рекурсивные вызовы анализатора. Например, разбирая CREATE TABLE, SQLite вызывает анализатор рекурсивно, чтобы произвести оператор INSERT, чтобы сделать новый вход в таблице sqlite_schema.

  • У Lemon есть понятие нетерминального деструктора, который может использоваться, чтобы освободить память или другие ресурсы после синтаксической ошибки или другого прерывания разбора.

2.1. Lemon в SQLite

Lemon используется в двух местах в SQLite.

Основное использование Лимона должно создать языковой анализатор SQL. Файл грамматики ( parse.y) собран Lemon в parse.c и parse.h. parse.c включен в объединение без дальнейшей модификации.

Lemon также используется, чтобы произвести анализатор для выражений образца запроса в расширении FTS5. В этом случае входной файл грамматики fts5parse.y.

2.2. Настройки Lemon специально для SQLite

Одно из преимуществ размещения инструментов генератора кода как части проекта то, что инструменты могут быть оптимизированы, чтобы удовлетворить определенные потребности полного проекта. Lemon извлек выгоду из этого эффекта. За эти годы генератор анализатора был расширен и увеличен, чтобы обеспечить новые возможности и улучшить работу. Несколько определенных улучшений к Lemon, которые специально предназначены для использования SQLite, включают:

  • Lemon имеет понятие символа "fallback". Язык SQL содержит большое количество ключевых слов, и у этих ключевых слов есть потенциал, чтобы столкнуться с именами идентификатора. У лимона есть способность определять некоторые ключевые слова как отступление к идентификатору. Если ключевое слово появляется во входном потоке символа в контексте, который иначе был бы синтаксической ошибкой, символ автоматически преобразовывается в его отступление, прежде чем синтаксическая ошибка будет выдана. Эта особенность позволяет анализатору быть очень прощающим относительно зарезервированных слов, используемых в качестве идентификаторов, что является проблемой, которая часто происходит на языке SQL.

  • В поддержку 100% MC/DC testing для SQLite код анализатора, произведенный Lemon, не имеет никаких недостижимых отделений и содержит дополнительную (выбранную во время компиляции) инструментовку, полезную для измерения тестового покрытия.

  • Lemon поддерживает условную компиляцию правил файла грамматики, чтобы различный анализатор мог быть произведен в зависимости от вариантов времени компиляции.

  • Как исполнительная оптимизация, уменьшено действие в Lemon входной грамматике, позволяя содержать комментарии формы "/*A-overwrites-Z*/", чтобы указать, что семантическое значение "A" на правой стороне правила может непосредственно переписать семантическое значение "Z" на левой стороне. Эта простая оптимизация сокращает количество операций по стеку в автоматизации push-down, используемом, чтобы разобрать входную грамматику, и таким образом улучшить исполнение анализатора. Это также делает произведенный код немного меньше.

Парсинг SQL-операторов это значительный потребитель циклов CPU в любом движке базы данных SQL. Продолжающиеся усилия оптимизировать SQLite заставили разработчиков тратить много на отладку Lemon, чтобы произвести более быстрые анализаторы. Эти усилия принесли пользу всем пользователям. Но и если бы Lemon был отдельно сохраняемым инструментом, было бы более трудно внести скоординированные изменения в SQLite и в Lemon. Следовательно, то, что инструмент генератора анализатора включен в исходное дерево для SQLite, оказалось полезно для самого инструмента и для SQLite.

3. История Lemon

Lemon был первоначально написан Д. Ричардом Хиппом (также создатель SQLite), в то время как он был в аспирантуре в Университете Дюка между 1987 и 1992. Оригинальная дата создания Lemon была потеряна, но была, вероятно, когда-то приблизительно в 1990. Lemon производит анализатор LALR(1). Был компаньон генератора анализатора LL(1) под названием "Lime", но исходный код для него был потерян.

Исходный код Lemon был первоначально написан как отдельные исходные файлы, и только позже слился в единственный "lemon.c".

Автор Lemon и SQLite (Hipp) сообщает, что его навыки C-программирования были значительно увеличены, изучив код первоисточника John Ousterhout. Hipp обнаружил и изучил Tcl в 1993. Lemon был написан к тому времени, и SQLite впоследствии. Есть четкое различие в стилях кодирования этих двух продуктов с SQLite, кажущимся быть более чистым, более удобочитаемым и легче в поддержке.