如何使用Antlr解析Python代码中的符号?

如何使用Antlr解析Python代码中的符号?,python,antlr,antlr4,Python,Antlr,Antlr4,我在下面的位置使用Python3语法 我需要解析以下代码 ANTLRInputStream input = new ANTLRInputStream(new FileInputStream("Functions.py")); Python3Lexer lexer = new Python3Lexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); Python3Parser parser = new Python

我在下面的位置使用Python3语法

我需要解析以下代码

ANTLRInputStream input = new ANTLRInputStream(new FileInputStream("Functions.py"));
Python3Lexer lexer = new Python3Lexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
Python3Parser parser = new Python3Parser(tokens);

ParseTree tree = parser.funcdef(); //Not sure what to do here
ParseTreeWalker walker = new ParseTreeWalker();

walker.walk(new Listener(), tree);
Listener.java

public class Listener extends Python3BaseListener{
    @Override
    public void enterImport_name(Python3Parser.Import_nameContext ctx) { 
        System.out.println(ctx.getText());
    }

    @Override 
    public void enterFuncdef(Python3Parser.FuncdefContext ctx) { 
    System.out.println(ctx.getText()); //returns the whole code as string
    }   
}
我试图从python文件中读取所有导入、变量和方法名以及参数


我该怎么做?

这不是一个小问题。作为编写监听器的一般方法,我建议您获得打印解析树的代码,将其添加到程序中,然后尝试几个不同的源文件。然后,您可以决定如何编写侦听器以及为哪些节点编写侦听器

例如 第一个导入子树如下所示:

  ( stmt
    ( simple_stmt
      ( small_stmt
        ( import_stmt
          ( import_name
            ( TOKEN i=2 t=import
            ) 
            ( dotted_as_names
              ( dotted_as_name
                ( dotted_name
                  ( HIDDEN text=\ 
                  ) 
                  ( TOKEN i=4 t=collections
      ) ) ) ) ) ) ) 
      ( TOKEN i=5 t=\r\n
  ) ) ) 
您需要查看语法,并验证您的示例是否真正涵盖了语法。对于base_events.py,不会执行import_from(),因此您必须编写一些使用该语法的示例。根据您所说的,以及我所看到的,我将为虚线_as_name上下文创建一个侦听器,验证其父项是否为import_stmt,然后只获取第一个子项的文本。如果您不关心从getText()返回的字符串中也出现“import”、“as”和逗号,那么enterImport\u name()是一个不错的选择

但是,我想你有这张照片