如何使用 Antlr 解析 Python 代码中的符号?
How to parse symbols from Python code with Antlr?
我正在使用以下位置的 Python3 语法,
https://github.com/antlr/grammars-v4/blob/master/python3/Python3.g4
我有下面的代码要解析,
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 文件中的参数。
我该怎么做?
这不是一个小问题。作为编写侦听器的一般方法,我建议您获取代码来打印解析树,将其添加到您的程序中,然后尝试几个不同的源文件。然后,您可以决定如何编写侦听器以及为哪些节点编写侦听器。
例如,https://github.com/antlr/grammars-v4/blob/master/python3/examples/base_events.py,
首先导入子树如下所示:
( 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 未执行 (https://www.geeksforgeeks.org/import-module-python/),因此您必须编写一些使用该语法的示例。根据您所说的和我所看到的,我会为 dotted_as_name 上下文创建一个侦听器,验证其父项是 import_stmt,然后只获取第一个子项的文本。如果您不关心 "import"、"as" 和逗号也出现在从 getText() 返回的字符串中,enterImport_name() 是一个不错的选择。
但是,我想你有照片。
我正在使用以下位置的 Python3 语法,
https://github.com/antlr/grammars-v4/blob/master/python3/Python3.g4
我有下面的代码要解析,
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 文件中的参数。
我该怎么做?
这不是一个小问题。作为编写侦听器的一般方法,我建议您获取代码来打印解析树,将其添加到您的程序中,然后尝试几个不同的源文件。然后,您可以决定如何编写侦听器以及为哪些节点编写侦听器。
例如,https://github.com/antlr/grammars-v4/blob/master/python3/examples/base_events.py, 首先导入子树如下所示:
( 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 未执行 (https://www.geeksforgeeks.org/import-module-python/),因此您必须编写一些使用该语法的示例。根据您所说的和我所看到的,我会为 dotted_as_name 上下文创建一个侦听器,验证其父项是 import_stmt,然后只获取第一个子项的文本。如果您不关心 "import"、"as" 和逗号也出现在从 getText() 返回的字符串中,enterImport_name() 是一个不错的选择。
但是,我想你有照片。