使用Antlr4插入额外的代码行

时间:2014-06-04 05:40:41

标签: java antlr antlr4 code-translation program-transformation

目标是插入代码以监视Java synchronized块的进入和退出。

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

   ...

leavingSync();
}
leftSync();

我最初的想法是实现进入/退出侦听器方法(在Java同步块周围添加子树),然后打印出结果AST。现在我意识到antlr4似乎不支持树修改,我应该考虑哪些替代方案?

1 个答案:

答案 0 :(得分:3)

最好的解决方案是使用令牌流重写引擎而不是操纵解析树。以书为例; 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);
    }
}