2015-04-07 55 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」,那麼是的,這是由詞法分析器分配的。 –