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

Sql 如何处理Antlr 4生成的LISP样式树?,sql,parsing,antlr4,parse-tree,s-expression,Sql,Parsing,Antlr4,Parse Tree,S Expression,我使用Antlr 4语法解析了一个SQL查询。 tree.toStringTree()的结果如下: ([]([845]选择([878 845]([1473 878 845]([1129 1473 878 845]([1700 1129 1473 878 845]col1))作为([1477 878 845]a))从([887 845]([1487 887 845]([1694 1487 887 845]表1())))) Antlr文档告诉我这是一个LISP风格的树。如何进一步处理LISP树 如果

我使用Antlr 4语法解析了一个SQL查询。 tree.toStringTree()的结果如下: ([]([845]选择([878 845]([1473 878 845]([1129 1473 878 845]([1700 1129 1473 878 845]col1))作为([1477 878 845]a))从([887 845]([1487 887 845]([1694 1487 887 845]表1()))))


Antlr文档告诉我这是一个LISP风格的树。如何进一步处理LISP树

如果您提供
解析器
实例,对您的眼睛更友好:

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
,它有父引用和子引用。如果这不是你想要的,请更好地解释自己。

Hi@Bart-谢谢你的见解。一个非常基本的问题,树字符串中的数字是否代表Lexer分配的令牌号?@user3898179,没问题。如果“number”是指表示令牌类型的
int
,那么是的,由lexer分配。