如何在 antlr4 中仅查找被覆盖的方法



我正在尝试使用带有python运行时的antlr4在java文件中查找所有被覆盖的方法。我从 https://github.com/antlr/grammars-v4/tree/master/java 那里学到了语法。我能够使用以下代码成功找到方法。

istream = FileStream(repo_path, encoding='utf-8')
lexer = JavaLexer(istream)
stream = CommonTokenStream(lexer)
parser = JavaParser(stream)
tree = parser.compilationUnit()
walker = ParseTreeWalker()
walker.walk(PatternListener(), tree)

在侦听器内部,

def enterMethodDeclaration(self, ctx):
method_name = ctx.IDENTIFIER().getText()
method_defition = ctx.methodBody().getText()

现在,我只想跟踪被覆盖的方法,而不是所有方法。 因此,我进行了以下更改。

在JavaLexer.g4中,

OVERRIDEN           '@Override';

在JavaParser.g4中,

methodDeclaration
: OVERRIDEN typeTypeOrVoid IDENTIFIER formalParameters ('[' ']')*
(THROWS qualifiedNameList)?
methodBody
;

将方法声明限制为仅覆盖方法,并且我再次重新生成了所有词法分析和解析器。但是这次我在解析时遇到了许多不匹配问题,如下所示。

line 71:15 extraneous input 'void' expecting {<EOF>, 'abstract', 'boolean', 'byte', 'char', 'class', 'double', 'enum', 'final', 'float', 'int', 'interface', 'long', 'native', 'private', 'protected', 'public', 'short', 'static', 'strictfp', 'synchronized', 'transient', 'volatile', '@Override', '{', '}', ';', '<', '@', IDENTIFIER}
line 74:23 mismatched input '(' expecting ';'

任何人都可以强调我在这里犯的错误,还有其他方法可以实现这一点吗?任何建议或讨论不胜感激。提前谢谢你:(。

您更改了语法,因此所有方法都必须具有@Override注释。看起来至少有一个方法没有这样的注释。因此,您的 Java 文件不再适合您的语法,并且您会收到语法错误。

如果您不想更改哪些文件在语法上有效,而只想更改侦听器处理的方法,那么您应该更改侦听器 - 而不是语法。具体来说,你应该检查你的methodDeclaration所属的classBodyDeclaration(即methodDeclaration的祖父级(是否包含一个名为@Override的注释(如果没有,就什么都不做(。

最新更新