如何处理 Antlr 4 生成的 LISP 样式树?
How can I process the LISP style tree generated by Antlr 4?
我使用 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 )) 从 ([887 845] ([1487 887 845] ([1694 1487 887 845] 表 1)))))
Antlr 文档告诉我这是一个 LISP 风格的树。如何进一步处理 LISP 树?
如果您提供 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
,它有父引用和子引用。如果那不是你想要的,请更好地解释你自己。
我使用 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 )) 从 ([887 845] ([1487 887 845] ([1694 1487 887 845] 表 1)))))
Antlr 文档告诉我这是一个 LISP 风格的树。如何进一步处理 LISP 树?
如果您提供 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
,它有父引用和子引用。如果那不是你想要的,请更好地解释你自己。