【问题标题】:Inserting extra lines of code using Antlr4使用 Antlr4 插入额外的代码行
【发布时间】:2014-07-24 15:43:12
【问题描述】:

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

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

   ...

leavingSync();
}
leftSync();

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

【问题讨论】:

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

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


【解决方案1】:

最好的解决方案是使用令牌流重写引擎而不是操纵解析树。以书为例; http://amzn.com/1934356999。这是一个将序列化标识符插入类体的代码 sn-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);
    }
}

【讨论】:

    猜你喜欢
    • 2016-08-17
    • 2014-03-14
    • 2016-04-07
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多