2012-02-10 70 views
1

我们有一个为我们自动生成Java和C++存根的CORBA实现。由于CORBA生成的代码很难处理,我们需要围绕CORBA代码编写包装器/帮助器。因此,我们有一个2级代码生成过程(是的,我知道这是不好的):如何编写将C++代码作为输入的C++代码生成器?

CORBA IDL - >恼人的CORBA生成的代码 - >有用的包装/辅助功能

使用Java的反射,我可以检查CORBA生成的代码并使用它生成其他代码。但是,因为C++没有反射,我不知道如何在C++端做到这一点。我应该使用C++解析器吗? C++模板?

TLDR:如何使用生成的C++代码作为输入生成C++代码?

+0

“生成的C++代码”是什么意思? – m0skit0 2012-02-10 16:21:08

+0

由第三方CORBA供应商从IDL生成。所以代码是标准的风格。 – 2012-02-10 16:29:45

回答

2

您是否考虑退后一步并将IDL用作自定义代码生成器的源代码?可能你有一些隐藏了重复,var,ptr等东西的包装代码。我们有一个基于Ruby的CORBA IDL编译器,它目前生成Ruby和C++代码。这可以通过客户生成器进行扩展,对于RIDL和R2CORBA,请参阅http://www.remedy.nl

另一个选择是检查我们正在处理的IDL到C++ 11语言映射,更多关于http://taox11.remedy.nl的详细信息。这种新的语言映射更容易使用,并使用标准类型和STL容器来处理。

+0

想过它,但从来没有找过IDL解析器。谢谢! – 2012-02-13 13:57:27

+0

您需要的是一个IDL编译器,您可以轻松添加另一个后端。我们的RIDL编译器是用Ruby编写的,并使用小文件,您可以使用任何编辑器编辑这些文件,然后用它们来生成代码。有关OSPortal的R2CORBA和IDL to C++ 11项目,请参阅我们生成的示例代码。 – 2012-02-13 18:55:35

+0

同一行中的另一个解决方案是使用http://code.google.com/p/idl4emf/。它是Eclipse Modeling Framework中的IDL语法和元模型的实现。它包含一个示例生成器项目。在http://code.google.com/p/corbasim/中,您可以看到一个使用示例,其中部分实现了IDL到C++的映射。我们使用它从我们的IDL文件生成额外的C++代码。 – 2012-08-23 09:03:50

2

GCC XML可能有助于恢复界面。

我正在使用它为OpenGL和Horde3D渲染引擎编写Prolog外部接口。

我感兴趣的接口仅限于C,但GCC XML也处理C++。

GCC XML解析源代码接口并发出和XML AST。然后用XML库很容易提取请求的信息。一个细微差别就是宏观符号的丧失:AFAIK只是值得生存下来的分析。作为一个例子,在这里(的一部分),用于生成FLI Prolog的代码:

make_funcs(NameChange, Xml, FileName, Id) :- 
    index_id(Xml, Indexed), 

    findall(Name:Returns:ArgTypes, 
     (xpath(Xml, //'Function'(@file = Id, @name = Name, @returns = ReturnsId), Function), 
     typeid_indexed(Indexed, ReturnsId, Returns), 
     findall(Arg:Type, (xpath(Function, //'Argument'(@name = Arg, @type = TypeId), _), 
        typeid_indexed(Indexed, TypeId, Type)), ArgTypes) 
     ), 
     AllFuncs), 

    length(AllFuncs, LAllFuncs), 
    writeln(FileName:LAllFuncs), 

    fat('prolog/h3dplfi/~s.cpp', [FileName], Cpp), 
    open(Cpp, write, Stream), 
    maplist(\X^((X = K-A -> true ; K = X, A = []), format(Stream, K, A), nl(Stream)), 
     ['#include "swi-uty.h"', 
     '#include <[email protected]>'-[call(NameChange, FileName)] 
     ]), 

    forall(member(F, AllFuncs), make_func(Stream, F)), 
    close(Stream). 

的XPath(你猜),它是SWI-Prolog的图书馆,使分析更简单...

+0

有趣的是,如果我使用这个工具,我不必用C++编写它。 – 2012-02-10 16:50:47

+0

@Garret:应该有类似的路径使用libclang,[例如与Python](http://stackoverflow.com/questions/3334170/is-there-python-clang-wrapper-in-the-vein-of-pygccxml-which-wraps-gcc-xml)。 – 2012-02-10 17:46:13

+0

令人印象深刻的Prolog使用粗糙的XML ... – 2012-04-20 18:44:46

0

如果您想要可靠地处理C++源代码,您需要一个能够理解C++语法和语义,可以解析C++代码,转换解析表示并重新生成有效C++代码(包括原始注释)的程序转换工具。这种工具实际上通过在之外运行来实现任意元编程,因此它不受语言内置的“反射”或“元编程”设施的限制。

我们的DMS Software Reengineering Toolkit及其C++ Front End可以做到这一点。

它已被用于许多C++自动化转换任务,这两个任务都意外地与基于CORBA的活动相关。第一个包括将专有分布式系统的整形界面集成到与CORBA兼容的方面。第二个改变了面对IDL变化的基于CORBA的大型应用程序;这种更改实际上导致代码被移动并导致签名更改。您可以在网站上找到描述第一项活动的技术文件;第二个是为一个主要的防务承包商完成的。

+0

gccxml得到了商业化? :) – 2012-02-10 21:47:19

+0

比GCCXML更多。 GCCXML需要一个C++编译单元并生成一个包含声明但不包含函数体的XML文档。好的,如果你想知道什么是定义的,以及它是如何定义的。如果你想a)检查函数/方法体,b)转换定义或代码,c)分析代码流,d)重新生成源代码,e)处理任何大的东西(它的XML!),这并不好。我认为GCCXML只是DMS的一小部分。最后一个问题:DMS处理的语言多于C++ ......呃,是的,关于“商业”的部分是正确的。 – 2012-02-10 22:23:58

0

看看Clang compiler,除了作为一个独立的编译器之外,它还可以用作你所描述的情况下的库。它会为您提供解析树,您可以在其中进行分析和转换