如何从 java 中的 ANTLR AST 生成函数定义?
How to generate function definitions from ANTLR AST in java?
我使用了 Python3 语法并构建了 AST。
我的源字符串只是 Python 的一个小函数。
我的代码如下:
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());
}
}
这里,函数名怎么输出呢? (和)?
我有点难以理解语法。
几件事:
- 您应该使用解析器规则
file_input
作为起点:single_input
用于对 Python 源 的 REPL 类解析
public enterFuncdef
无效 Java 代码:您缺少 return 类型(void
,在这种情况下)
- 您正在解析的 Python 来源无效 Python 3 来源。
print "..."
应该是 print("...")
现在,如果您查看正在侦听的解析器规则:
funcdef
: DEF NAME parameters ( '->' test )? ':' suite
;
你看到它有一个 NAME
令牌。你可以这样获取它:
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());
}
}
运行 上面的 class 将打印:NAME=sum
顺便说一句,语法库中有一个示例完全符合您的要求:https://github.com/bkiers/python3-parser/blob/master/src/main/java/nl/bigo/pythonparser/Main.java
我使用了 Python3 语法并构建了 AST。 我的源字符串只是 Python 的一个小函数。 我的代码如下:
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());
}
}
这里,函数名怎么输出呢? (和)? 我有点难以理解语法。
几件事:
- 您应该使用解析器规则
file_input
作为起点:single_input
用于对 Python 源 的 REPL 类解析
public enterFuncdef
无效 Java 代码:您缺少 return 类型(void
,在这种情况下)- 您正在解析的 Python 来源无效 Python 3 来源。
print "..."
应该是print("...")
现在,如果您查看正在侦听的解析器规则:
funcdef
: DEF NAME parameters ( '->' test )? ':' suite
;
你看到它有一个 NAME
令牌。你可以这样获取它:
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());
}
}
运行 上面的 class 将打印:NAME=sum
顺便说一句,语法库中有一个示例完全符合您的要求:https://github.com/bkiers/python3-parser/blob/master/src/main/java/nl/bigo/pythonparser/Main.java