SWIG:如何根据正则表达式重命名生成的Java代码?

时间:2014-02-14 15:50:38

标签: java c++ regex rename swig

我正在使用Swig从C / C ++代码生成Java代码。

我得到的许多课程都是人类不可读的,有点像“SWIG_p_f_p _ms”,而且很长。

但是,我需要最终生成的类来遵守一些命名规则。

例如:

应删除

SWIG_p_f_p _ ,并将其替换为某种 PointerOn ...

此外,在C ++代码中有一个后缀(不是由SWIG生成的), FFE _ 用于许多方法,我需要删除它。

我在SWIG的文档中发现,有一个重命名和使用正则表达式的例子:

%rename("%(regex:/^([A-Z][a-z]+)+_(.*)/\\2/)s", %$isenumitem) "";

但我不知道如何在我的情况下适应它。

此外,以这种方式拥有我的界面(* .i)的内容:

%module FfeFooJava
%{
#include "foo.h"
}
// some typemaps here that use some C++ classes and C structures having suffix FFE
//.....

%include "foo.h"

我在哪里可以添加重命名说明?

备注:

我试过这个指示:

%rename("%(regex:/^(FFE_)(.*)/\\2/)s") "";

它甚至改变了一些字符串值。例如,字符串“FFE_OK”已变为“确定”。所以我想知道是否可以在C ++类或结构或其他方面应用命名规则,这有助于我排除字符串修改。

非常感谢你!

2 个答案:

答案 0 :(得分:1)

我不熟悉SWIG,但我对正则表达式有一些了解。

试试这个正则表达式:

%(regex:/SWIG_p_f_p_([A-Za-z\\d_]+)/PointerOn\\1/)

描述

     SWIG_p_f_p_([A-Za-z\\d_]+)
     ^            ^            
     |            |            
     |            |            
     |            |
Generated prefix  |  
                  |
                Character class allowing upper/lower cased letters,
                underscores, and digits inside class names.

答案 1 :(得分:1)

在您的情况下,您可能不必使用regexp重命名。您应该能够通过%inline导出typedef(以及包装类或函数,如果需要,可以使用非常强大的%扩展,但我无法从您的帖子中得知)。我在其他几篇SO文章中展示了如何通过其他高级(声明性而非程序性)SWIG功能来避免使用类型映射。如果您发布一些.i代码并显示您获得的swig_p_f_p等,我会看到我是否可以更具体。