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

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

т.е.

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

   ...

leavingSync();
}
leftSync();

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

1 ответ

Решение

Лучшее решение - использовать механизм перезаписи потока токенов, а не манипулировать деревом разбора. Книга в качестве примера; 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);
    }
}
Другие вопросы по тегам