如何在Java中从ANTLR AST生成函数定义? [英] How to generate function definitions from ANTLR AST in java?
问题描述
我已使用Python3语法并构建了AST。
我的源字符串只是Python的一个小功能。
我的代码如下:
I have used Python3 grammar and have built an AST. My source string is just a small function of Python. My code is as follows:
public class Main {
public static void main(String[] args) {
String source = "def sum( arg1, arg2 ):\r\n"
+ " total = arg1 + arg2\r\n"
+ " print \"Inside the function : \", total\r\n"
+ " return total;\n";
Python3Lexer lexer = new Python3Lexer(CharStreams.fromString(source));
Python3Parser parser = new Python3Parser(new CommonTokenStream(lexer));
ParseTreeWalker.DEFAULT.walk(new Python3BaseListener() {
@Override
public enterFuncdef(Python3Parser.FuncdefContext ctx) {
//Here which function would give me the function definition?
}
}, parser.single_input());
}
}
在这里,如何输出函数名称? (和)?
我在理解语法上有些困难。
Here, how do I output the name of the function? (sum)? I am having a little hard time understanding the grammar.
推荐答案
以下几点:
- 您应该使用解析器规则
file_input
作为起点:single_input
用于 REPL 类似于a>的Python源解析 -
public enterFuncdef
在无效的Java代码中:您缺少返回类型(void
,在这种情况下) - 您正在无效的Python 3源中解析的Python源。
print ...
应该是print( ...)
- you should use the parser rule
file_input
as your starting point:single_input
is used for REPL-like parsing of Python source public enterFuncdef
in not valid Java code: you're missing a return type (void
, in this case)- the Python source you're parsing in not valid Python 3 source.
print "..."
should beprint("...")
现在,如果您查看解析器规则,那么您正在听:
Now, if you look at the parser rule you're listening for:
funcdef
: DEF NAME parameters ( '->' test )? ':' suite
;
您会看到它具有 NAME
令牌。您可以这样保存它:
you see it has a NAME
token. You can get a hold of it like this:
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
public class Main {
public static void main(String[] args) {
String source = "def sum( arg1, arg2 ):\r\n"
+ " total = arg1 + arg2\r\n"
+ " print(\"Inside the function : \", total)\r\n"
+ " return total;\n";
Python3Lexer lexer = new Python3Lexer(CharStreams.fromString(source));
Python3Parser parser = new Python3Parser(new CommonTokenStream(lexer));
ParseTreeWalker.DEFAULT.walk(new Python3BaseListener() {
@Override
public void enterFuncdef(Python3Parser.FuncdefContext ctx) {
System.out.printf("NAME=%s\n", ctx.NAME().getText());
}
}, parser.file_input());
}
}
运行上面的类将打印: NAME = sum
Running the class above will print: NAME=sum
顺便说一句,语法库中有一个示例可以完全满足您的要求: https://github.com /bkiers/python3-parser/blob/master/src/main/java/nl/bigo/pythonparser/Main.java
Btw, there is an example from the grammar's repo that does exactly what you're trying to: https://github.com/bkiers/python3-parser/blob/master/src/main/java/nl/bigo/pythonparser/Main.java
这篇关于如何在Java中从ANTLR AST生成函数定义?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!