Java 使用Antlr4插入额外的代码行

Java 使用Antlr4插入额外的代码行,java,antlr,antlr4,code-translation,program-transformation,Java,Antlr,Antlr4,Code Translation,Program Transformation,目标是插入代码来监视Java同步块的进入和退出 i、 e 我最初的想法是实现enter/exit侦听器方法(在Java同步块周围添加子树),然后打印出结果AST。现在我意识到,ANTLR4似乎不支持树修改,我应该考虑什么样的选择? < P>最好的解决方案是使用令牌流重写引擎而不是操纵解析树。以书为例。下面是将序列化标识符插入到类主体中的代码段 public class InsertSerialIDListener extends JavaBaseListener { TokenStrea

目标是插入代码来监视Java同步块的进入和退出

i、 e


我最初的想法是实现enter/exit侦听器方法(在Java同步块周围添加子树),然后打印出结果AST。现在我意识到,ANTLR4似乎不支持树修改,我应该考虑什么样的选择?

< P>最好的解决方案是使用令牌流重写引擎而不是操纵解析树。以书为例。下面是将序列化标识符插入到类主体中的代码段

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);
    }
}

最好的解决方案是使用令牌流重写引擎,而不是操纵解析树。以书为例。下面是将序列化标识符插入到类主体中的代码段

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);
    }
}

后来我意识到ANTLR4允许修改树。可以添加和删除ParseRuleContext的子级。但正如ANTLR的家伙所说,重写令牌流似乎是一个更好的选择。我发现这个答案有点令人惊讶。如果目标是操纵代码,如果操纵代码没有用,那么构建树又有什么意义呢?这表明一个人需要的不仅仅是解析(见我的简历)。要了解如何使用“树”(而不是ANTLR4)实现这一点,请参阅我在semanticdesigns.com/Company/Publications/TestCoverage.pdfI上关于在代码中插入任何类型的探测(示例是测试覆盖率)的论文。后来,我意识到ANTLR4允许修改树。可以添加和删除ParseRuleContext的子级。但正如ANTLR的家伙所说,重写令牌流似乎是一个更好的选择。我发现这个答案有点令人惊讶。如果目标是操纵代码,如果操纵代码没有用,那么构建树又有什么意义呢?这表明一个人需要的不仅仅是解析(见我的简历)。要了解如何使用“树”(而不是ANTLR4)实现这一点,请参阅我在semanticdesigns.com/Company/Publications/TestCoverage.pdf上关于在代码中插入任何类型的探测(示例是测试覆盖率)的论文