2015-04-06 49 views
0

使用Antlr4,我想要以Java/JavaScript代碼的形式生成分析樹。 這是我的main.Java看起來像Antlr 4在Java中生成分析樹代碼

String sql = "SELECT log AS x FROM t1 \n" + 
       "GROUP BY x\n" + 
       "HAVING count(*) >= 4 \n" + 
       "ORDER BY max(n) + 0"; 

     // Create a lexer and parser for the input. 
     SQLiteLexer lexer = new SQLiteLexer(new ANTLRInputStream(sql)); 
     SQLiteParser parser = new SQLiteParser(new CommonTokenStream(lexer)); 

     // Invoke the `select_stmt` production. 
     ParseTree tree = parser.select_stmt(); 
     ParseTreeWalker walker = new ParseTreeWalker(); 
     SQLiteListener listener = new SQLiteBaseListener(); 
     ParseTreeWalker.DEFAULT.walk(listener, tree); 
    System.out.println(listener.); 

我應該調用什麼功能來生成代碼格式解析樹?

+0

你能舉一個例子你想看標準嗎? – CoronA 2015-04-06 16:09:10

+0

@StefanA -I想要分層java類的形式的分析樹。 – user3898179 2015-04-07 04:36:26

回答

0

這條線:

ParseTree tree = parser.select_stmt(); 

是您解析樹。查看API文檔,看看它有什麼方法:http://www.antlr.org/api/JavaTool/org/antlr/v4/runtime/tree/ParseTree.html

您可能會對其getChild(...)getParent()方法感興趣。

+0

感謝Bart,我正在使用這種方法。我想知道這個分析樹是否可以以分層java classies的形式來查看。 – user3898179 2015-04-07 04:33:49

+0

嗨@ user3898179,不確定您的意思是「分層java類」。我對ParseTree的理解就是:可以訪問父節點和子節點的Java類(即「分層java類」)。 – 2015-04-07 10:59:29

2

我不確定您的意思是「分層」視圖。如果那是你正在尋找的,antlr命令行工具有-gui選項。否則,您可以通過在由ANTLR創建的enter/exist偵聽器方法中添加操作和/或添加Sysouts來打印如何評估語法。例如,如果您有以下語法:

grammar Grammar; 

@lexer::header{ 
//package name where Java files will be created 
} 

@parser::header{ 
//package name where Java files will be created 
} 


value : letters | number | string; 

letters : LETTERS; 
number : NUMBER; 
string : STRING; 

LETTERS : '/*' {System.out.println("Found Letters!");}; 
NUMBER : [0-9]+ {System.out.println("Found Number!");}; 
STRING : [a-zA-Z0-9]+ {System.out.println("Found String!");}; 

WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines 

ANTLR4會產生GrammarListener.java(假設你的語法被稱爲Grammar.g4)如果您運行右鍵單擊在Eclipse中.g4文件,並選擇安裝ANTRL4 IDE的「生成ANTLR識別器」。

Tool.main(new String[]{grammarFile, "-o", outputDirectory}); 

生成的接口包含的方法如如下::您還可以通過調用靜態org.antlr.v4.Tool.main生成使用Java解析器和詞法

public interface GrammarListener extends ParserTreeListener { 
    void enterValue(GrammarParser.Valuecontext ctx); 
    void exitValue(GrammarParser.ValueContext ctx); 
    void enterLetters(GrammarParser.StringContext ctx); 
    void exitLetters(GrammarParser.StringContext ctx); 
    . 
    . 
} 

您需要實現這個接口...

public class GrammarListenerImpl implements GrammarListener { 

. 
. 
@Override 
public void enterLetters(GrammarParser.LetterContext ctx) { 
System.out.println("Enter: Letters"); 
// do other stuff 
. 
. 
} 

,並添加Sysouts,在這種情況下,或其他業務邏輯來處理時,本場比賽發生在語法中。所述Sysouts可以產生類似:

Enter value 
    Enter Letters 
    Do something... 
    Exit Letters 
Exit value 

這將顯示出嵌套(格式將其與標籤/空間等),其中所述語法被評爲呼叫序列。

+0

一個很好的答案,但它錯過了旨在執行偵聽器和相關Sysout的代碼。 – 2017-05-12 13:59:30