Дерево разбора для операторов SQL - именно для оператора "SELECT" - PullRequest
2 голосов
/ 14 октября 2010

Я пишу (рукописный) парсер рекурсивного спуска для оператора SQL select в c ++, мне нужно знать, правильно ли создано мной дерево разбора, или нет. Я хочу проверить, но я не получил хорошие источники для деревьев разбора sql. Мой подход состоит в том, чтобы написать функцию для каждого производства, и в этой функции результат будет добавлен в корневое дерево. Может кто-нибудь мне помочь? Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 15 октября 2010

Моя компания строит много парсеров, и у вас такая же проблема.Недавно мы закончили анализатор SQL 2011 на основе чернового стандарта.

Практически вы решаете, правильно ли дерево разбора, проверяя его вручную во многих случаях исходного кода.Это предполагает, что вы можете напечатать дерево разбора в форме, которую вы можете легко проверить;это легко сделать с помощью рекурсивного обхода дерева разбора.Вы уже должны верить, что ваши абстрактные узлы синтаксического дерева правильно моделируют то, что вы намереваетесь захватить!]Вы тщательно выбираете кейсы для упражнений в разных частях грамматики (подумайте «модульные тесты для грамматик»).Для такого богатого языка, как SQL, это большая работа.

Вам также необходимо проверить, работает ли анализатор в целом, и вы делаете это, подавая lot реального кода дляконкретный диалект SQL, с которым вы работаете.Обычно я пытаюсь найти 100K-1M SLOC, и если парсер не может съесть все это, у меня еще есть работа.Достигнув этого уровня, вы как бы считаете, что с вашим парсером все в порядке, а дальнейшие ошибки рассматриваются как «проблемы с обслуживанием».

Хотя следующее может не помочь вам напрямую, оно может намекает на направление, в котором вымог возглавитьЯ использую несколько иной подход, основанный на наличии чрезвычайно мощного механизма разбора.Наш инструмент, DMS Software Reengineering Toolkit , с учетом грамматики, будет автоматически генерировать AST и имеет встроенные средства для печати таких деревьев анализа (в одной форме, как XML).AST имеет достаточно информации для регенерации («prettyprint») исходного текста, а DMS имеет встроенный prettyprinter.Поэтому, после ручной проверки множества случаев, я беру большой объем кода и для каждого файла анализирую его (не получая ошибок синтаксического анализа в силу проделанной выше работы), prettyprint источник и повторно обработать источник (ожидая, что ошибок не будет).Это сильный намек на то, что мы ничего не потеряли в двустороннем путешествии.

У нас есть новый инструмент, Smart Differencer , который сравнивает текст двух программ, чтобы увидеть, если они«то же самое», игнорируя правила компоновки языка.По сути, он работает, анализируя два файла и разделяя их деревья синтаксического анализа, игнорируя форматирование (строка / колонка / escapes / radix / comments / whitespace).То, что мы начинаем делать, - это анализировать исходный код, распечатывать его и умно выводить результат распечатки с оригинальным файлом.SmartDiff должен сказать «нет различий AST».Это гораздо более сильный намек на то, что мы ничего не потеряли.Вы можете сделать почти то же самое, если захотите сравнить свои деревья анализа до и после.

2 голосов
/ 14 октября 2010

Я не знаю, как вы будете проверять правильность кода, но если вас беспокоит понимание грамматики SQL, здесь - это веб-сайт, на котором перечислены грамматики BNF для различные диалекты SQL. Вы должны быть в состоянии создать свой синтаксический анализатор в соответствии с этими правилами.

0 голосов
/ 15 октября 2010

Этот синтаксический анализатор , основанный на pyparsing, может быть полезен в качестве второго ресурса синтаксического анализа SELECT (хотя он есть в Python, а не в C ++, извините).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...