如何编写一个以C ++代码作为输入的C ++代码生成器?

时间:2012-02-10 16:16:05

标签: c++ parsing reflection code-generation corba

我们有一个CORBA实现,可以为我们自动生成Java和C ++存根。因为CORBA生成的代码很难使用,所以我们需要围绕CORBA代码编写包装器/帮助器。所以我们有一个两步代码生成过程(是的,我知道这很糟糕):

CORBA IDL - >烦人的CORBA生成的代码 - >有用的包装器/辅助函数

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

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

4 个答案:

答案 0 :(得分: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 <~@>'-[call(NameChange, FileName)]
        ]),

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

xpath (你猜它)它是SWI-Prolog库,使分析更简单......

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

我们的DMS Software Reengineering Toolkit及其C++ Front End可以执行此操作。

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

答案 3 :(得分:0)

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