Antlr 4在Java中生成解析树代码

时间:2015-04-06 13:30:04

标签: java sql parsing antlr antlr4

使用Antlr4,我想以Java / JavaScript代码的形式生成解析树。 这就是我的main.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.);

我应该调用什么函数来生成代码格式的解析树?

2 个答案:

答案 0 :(得分:2)

我不确定“层次”视图的含义。如果这就是您要查找的内容,则使用antlr命令行工具有-gui选项。否则,您可以通过在ANTLR创建的输入/存在侦听器方法中添加操作和/或添加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文件并选择“Generate ANTLR Recognizer”并安装了ANTRL4 IDE 。您还可以通过调用静态 org.antlr.v4.Tool.main 来使用Java生成解析器和词法分析器:

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

生成的界面将包含如下方法:

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

这将显示嵌套(使用制表符/空格等格式化)语法评估的调用序列。

答案 1 :(得分:1)

这一行:

ParseTree tree = parser.select_stmt();

是你的解析树。查看API文档以了解它具有哪种方法:http://www.antlr.org/api/JavaTool/org/antlr/v4/runtime/tree/ParseTree.html

您可能对其getChild(...)getParent()方法感兴趣。