Вставка дополнительных строк кода с помощью Antlr4

1

Целью является вставка кодов для контроля входа и выхода из синхронизированного блока Java.

т.е.

enteringSync();
synchronized(lockObj){
enteredSync();

   ...

leavingSync();
}
leftSync();

Моя первоначальная мысль заключалась в том, чтобы внедрить методы ввода/вывода (которые добавляют поддеревья вокруг блока синхронизации Java), а затем распечатать полученный AST. Теперь я понял, что antlr4, похоже, не поддерживает древовидную модификацию, какие альтернативы мне следует учитывать?

  • 0
    Позже я понял, что ANTLR4 позволяет модифицировать дерево. Можно добавлять и удалять дочерние элементы ParseRuleContext. Но, как сказал парень ANTLR, переписывание потока токенов представляется лучшим вариантом.
  • 0
    Я нашел этот ответ немного удивительным. Если цель состоит в том, чтобы манипулировать кодом, какой смысл строить деревья, если манипулировать ими бесполезно? Это говорит о том, что человеку нужна жизнь за пределами простого анализа (см. Мою биографию). Чтобы узнать, как это сделать с «деревьями» (но не с ANTLR4), см. Мою статью о вставке любого типа проб в код (пример для тестового покрытия) по адресу semanticdesigns.com/Company/Publications/TestCoverage.pdf
Теги:
antlr4
antlr
code-translation
program-transformation

1 ответ

2
Лучший ответ

Лучшее решение - использовать механизм перезаписи токенов, а не манипулировать деревом разбора. Книга как пример; http://amzn.com/1934356999. Вот фрагмент кода, который вставляет идентификаторы сериализации в тела классов.

public class InsertSerialIDListener extends JavaBaseListener {
    TokenStreamRewriter rewriter;
    public InsertSerialIDListener(TokenStream tokens) {
        rewriter = new TokenStreamRewriter(tokens);
    }
    @Override
    public void enterClassBody(JavaParser.ClassBodyContext ctx) {
        String field = "\n\tpublic static final long serialVersionUID = 1L;";       
        rewriter.insertAfter(ctx.start, field);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню