2

我是 ANTLR 的新手。我的目标是将我们的代码库升级到 Hibernate 4,较新的版本已弃用“HibernateCallback”类。我们有一个庞大的代码库,其中包含数千个对不推荐使用的类的引用。这就是我的想法: 1. 阅读 Java 源文件 2. 每当我们遇到以下代码时:

getDao().execute(new HibernateCallback() {
                        public Object doInHibernate(Session session)
                                        throws HibernateException {
                                //Some code;
                        }
                });

3.就在这段代码之前,我想插入另一行,如下所示:

session.doWork(new Work(){
        @Override
        public void execute(Connection conx) throws SQLException {
         //Some code from the previous pattern
        }
});

我有一个工作示例 - 但它打印到标准输出,我实际上想修改 antlr 解析器正在读取的非常 java 文件。

我在“ExtractInterfaceTool”一书中遵循的示例 - 用于从 java 类中提取 java 接口。

如果这个问题已经得到回答,那么请接受我的道歉 - 并请指出我正确的方向。

4

2 回答 2

0

我不认为源解析会让你走得很远。相反,我会使用IntelliJ Idea作为 IDE 并执行结构替换(在 AST 上搜索/替换)。此处解释了该机制: 结构搜索和替换:内容、原因和操作方法

该机制并不容易理解,但我想它看起来像这样:

$dao$().execute(new HibernateCallback() {
                        public Object doInHibernate(Session session)
                                        throws HibernateException {
                                $method_body$
                        }
                });

替换将遵循以下原则:

$session$.doWork(new Work(){
        @Override
        public void execute(Connection conx) throws SQLException {
            $method_body$
        }
});

您需要修改各个模板变量的设置,但该机制非常强大。一个巨大的优势是它不依赖于精确的拼写或参数类型,而是允许通配符类型、方法签名模式等。

于 2013-06-09T18:50:51.363 回答
0

ANTLR 4 目前没有任何自动源转换能力,至少在核心运行时没有。当我为 ANTLRWorks 2(它使用 ANTLR 在编辑源文件时解析源文件)实现一个小型重构操作时,我使用解析树中的信息来确定在哪里插入附加代码,但实际的插入过程是我所拥有的自己编码。

于 2013-05-22T12:28:55.413 回答