2015-04-07 48 views
2

我使用Antlr 4语法分析了SQL查询。 tree.toStringTree()的结果如下: ([]([845] SELECT([878 845]([1473 878 845]([1129 1473 878 845]([1700 1129 1473 878 845] col1)) )([1477 878 845] a))FROM([887 845]([1487 887 845]([1694 1487 887 845] table1)))))如何处理由Antlr 4生成的LISP样式树?

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 - 感谢您的见解。一个非常基本的问题,树字符串中的数字是否代表Lexer指定的令牌编号? – user3898179

+0

@ user3898179,没问题。如果用“数字”表示表示令牌类型的“int”,那么是的,这是由词法分析器分配的。 –