A couple of things:
- 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 be print("...")
Now, if you look at the parser rule you're listening for:
funcdef
: DEF NAME parameters ( '->' test )? ':' suite
;
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 ):
"
+ " total = arg1 + arg2
"
+ " print("Inside the function : ", total)
"
+ " return total;
";
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
", ctx.NAME().getText());
}
}, parser.file_input());
}
}
Running the class above will print: NAME=sum
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
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…