Как найти только переопределенные методы в antlr4 - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь найти все переопределенные методы в java файлах, используя antlr4 с python временем выполнения. Я взял грамматику из 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)

Inside Listener,

  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
    ;

, чтобы ограничить methodDeclaration только переопределенным методом, и Я заново сгенерировал все лексеры и парсеры снова. Но в этот раз у меня возникает много проблем с несовпадением при разборе, как показано ниже.

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 ';'

Может кто-нибудь подсказать ошибку, которую я здесь делаю, есть ли другой способ реализовать это ?. Любые предложения или обсуждения приветствуются. Заранее спасибо:).

1 Ответ

1 голос
/ 06 января 2020

Вы изменили грамматику, поэтому все методы должны иметь аннотацию @Override. Похоже, что хотя бы один из ваших методов не имеет такой аннотации. Поэтому ваш файл Java больше не соответствует вашей грамматике, и вы получаете синтаксическую ошибку.

Если вы не хотите изменять, какие файлы синтаксически допустимы, но хотите изменить только те методы, которые обрабатываются вашим слушатель, тогда вы должны сменить слушателя, а не грамматику. В частности, вы должны проверить, принадлежит ли classBodyDeclaration, к которому принадлежит ваш methodDeclaration (то есть родительский элемент methodDeclaration), аннотация с именем @Override (а затем просто ничего не делать, если это не так).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...