Моя компания строит много парсеров, и у вас такая же проблема.Недавно мы закончили анализатор 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».Это гораздо более сильный намек на то, что мы ничего не потеряли.Вы можете сделать почти то же самое, если захотите сравнить свои деревья анализа до и после.