Создание операторов SQL с помощью ANTLR

Я начинаю изучать ANTLR. Цель состоит в том, чтобы «перевести» строки в операторы SQL.

Один простой пример того, что я хочу сделать:

Если я получу строку "name = A and age = B" --- ANTLR ---> "select * from USERS where name = 'A' and age = 'B'"

Я читал некоторую информацию об ANTLR и следовал некоторым примерам, но они просто преобразуют входной поток символов (исходный файл) в AST. Но как я могу использовать ANTLR для перевода входного сообщения и использовать переведенный вывод?

Можете ли вы дать мне некоторые основные моменты или сказать мне, где я могу найти информацию об этом?

Я использую Eclipse IDE и плагин Maven ANTLR.


person user2144555    schedule 23.04.2014    source источник


Ответы (1)


ANTLR — это просто генератор парсеров. Вы можете вставлять в грамматику действия, которые собирают информацию или напрямую распечатывают вывод. Наиболее распространенный механизм — разрешить ANTLR создавать промежуточное представление в виде AST или, в ANTLR 4, дерева синтаксического анализа. Оттуда вы строите обходчик дерева, чтобы либо построить внутреннюю модель, либо напрямую сгенерировать вывод. Из внутренней модели, которая представляет конструкции на вашем языке вывода, вы можете затем сгенерировать вывод. Обычно я использую StringTemplate для создания структурированного текста.

Когда ввод и вывод очень похожи и, что более важно, порядок вывода очень похож, вы можете избежать синтаксически направленного перевода: то есть действия непосредственно в грамматике или действия, применяемые непосредственно к дереву синтаксического анализа.

Когда порядок вывода сильно отличается, вам нужно построить некоторую форму промежуточного представления. Представьте, что вы просто читаете кучу целых чисел и печатаете их в обратном порядке. Вы можете сделать это, просто распечатав числа, как вы их видите. Все это объясняется в моей [бесстыдной заглушке] книге «Шаблоны языковой реализации: создание собственных предметно-ориентированных и общих языков программирования» http://amzn.com/B00A376HGG

person Terence Parr    schedule 23.04.2014