2015-04-07 10 views
2

Я проанализировал SQL-запрос, используя грамматику Antlr 4. Результат tree.toStringTree(): ([] ([845] SELECT ([878 845] ([1473 878 845] ([1129 1473 878 845] ([1700 1129 1473 878 845] col1))) as ([1477 878 ​​845] a)) FROM ([887 845] ([1487 887 845] ([1694 1487 887 845] table1)))))Как обработать дерево стиля LISP, созданное Antlr 4?

Документация Antlr говорит мне, что это дерево стиля LISP , Как я могу обработать дерево LISP?

ответ

2

Это дружелюбнее для ваших глаз, если вы предоставите Parser экземпляра:

SQLiteLexer lexer = new SQLiteLexer(new ANTLRInputStream(sql)); 
SQLiteParser parser = new SQLiteParser(new CommonTokenStream(lexer)); 
ParseTree tree = parser.select_stmt(); 
System.out.println(tree.toStringTree(parser)); 

Что касается Вашего вопроса обработки этой строки: вы не должны. Это просто для отображения дерева. Как обычно работает toString(). Вы не должны разбирать эту строку, потому что нет гарантии, что она будет выглядеть одинаково от версии к версии.

Я предложил это раньше, но сделаю это еще раз: если вы хотите получить иерархическую структуру, просто работайте с ParseTree, у нее есть родительские и дочерние ссылки. Если это не то, что вы хотите, пожалуйста, объясните себя лучше.

+0

Привет @Bart - Спасибо за понимание. Чрезвычайно важный вопрос, номера чисел в String дерева представляют номера токенов, назначенные Lexer? – user3898179

+0

@ пользователь3898179, без проблем. Если под «номером» вы подразумеваете «int», который обозначает тип токена, то да, который назначается лексером. –