如何处理Antlr 4生成的LISP样式树?

时间:2015-04-07 12:29:15

标签: sql parsing antlr4 parse-tree s-expression

我使用Antlr 4语法解析了一个SQL查询。 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)))))

Antlr文档告诉我这是一个LISP样式树。如何进一步处理LISP树?

1 个答案:

答案 0 :(得分: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,就会有父和子引用。如果那不是你想要的,请更好地解释自己。