Парсер простейшей SQL грамматики с переводом в Mongo Shell синтаксис
- Язык программирования: Kotlin
- Время реализации: 7 часов
Пример использования транслятора представлен в тестовых сценариях, лежащих в файле srd/Program.kt
. Этапы трансляции:
- Разбитие строки SQL запроса на токены с помощью функции
SQLParser.lexer
- Парсинг исходной строки во внутреннюю структуру AST с помощью функции
SQLParser.parseSQL
- Сериализация AST в представление, распознаваемое Mongo Shell с помощью функции класса
SQLCategory
:parsedSql.toMongoDB
Грамматика языка, с которым осуществлялась работа, определена в виде БНФ:
<SQL> ::= SELECT <cols> FROM <name> [WHERE <conditional>] [OFFSET <INT>] [LIMIT <INT>]
<conditional> ::= <conditional> <lop> <conditional> | NOT <conditional> | <name> <cmp> <name>
<cols> ::= * | <names>
<names> ::= <name>, <names> | <name>
<name> ::= <STRING> | "<STRING>" | '<STRING>' | `<STRING>`
<lop> ::= AND | OR
<cmp> ::= > | < | >= | <= | = | <>
<INT> ::= 0 | 1 | ...
Для парсинга синтаксических категорий (указаны в угловых скобок, кроме знаков сравнения) использовались
функции специального именования parseName
, parseNames
, parseSql
, ..., а также классы, которые
представляли синтаксическую категорию: StringCategory
, NamesCategory
, ... -- все наследники SyntaxCategory
- Парсинг
SELECT
запроса с поддержкой конструкцийOFFSET
иLIMIT
, и без поддержкиWHERE
- Сериализация
SELECT
запроса в синтаксис Mongo DB Shell - Проверка параметров
OFFSET
иLIMIT
на корректность - Возможность окружения имён таблиц в запросе с помощью одинарных, двойных и косых кавычек с учётом корректного парсинга в MongoDB синтаксис
Поддержка WHERE
из-за недостатка времени
Получен первичный опыт разработки на языке Kotlin
Имелся опыт в парсинге MySQL запросов вместе с проверкой их семантической корректности с использованием NodeJS: