解析java源文件,然后使用ANTLR4修改原始源文件

解析java源文件,然后使用ANTLR4修改原始源文件,java,antlr,antlr4,Java,Antlr,Antlr4,我是ANTLR的新手。 我的目标是将我们的代码库升级到Hibernate 4,更新的版本已经弃用了类“HibernateCallback”。 我们有一个庞大的代码库,其中有数千个不推荐使用的类的引用。 这就是我的想法: 1.读取Java源文件 2.每当我们遇到以下代码时: getDao().execute(new HibernateCallback() { public Object doInHibernate(Session session)

我是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
        }
});
$dao$().execute(new HibernateCallback() {
                        public Object doInHibernate(Session session)
                                        throws HibernateException {
                                $method_body$
                        }
                });
我有一个工作示例-但它打印到标准输出,我实际上想修改antlr解析器正在读取的java文件

我在《ExtractInterfaceTool》一书中引用了一个示例,用于从java类中提取java接口


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

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

我认为源解析不会让你走得很远。相反,我将使用作为IDE并执行结构替换(在AST上搜索/替换)。其机理如下所述:

机制不是那么容易理解,但我猜它看起来是这样的:

session.doWork(new Work(){
        @Override
        public void execute(Connection conx) throws SQLException {
         //Some code from the previous pattern
        }
});
$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$
        }
});

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

类似于Context.StartToken.getLine()。因此,首先保存所有TobeInsertedText的位置。下一步编辑ANTLR之外的文件-因为插入操作会弄乱行号-所以我想我必须从文件底部开始插入一个。谢谢Sean!它看起来非常有趣和强大,我必须先花一些时间来理解它:-)