使用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.);
我应该调用什么函数来生成代码格式的解析树?
答案 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()
方法感兴趣。