我们有一个CORBA实现,可以为我们自动生成Java和C ++存根。因为CORBA生成的代码很难使用,所以我们需要围绕CORBA代码编写包装器/帮助器。所以我们有一个两步代码生成过程(是的,我知道这很糟糕):
CORBA IDL - >烦人的CORBA生成的代码 - >有用的包装器/辅助函数
使用Java的反射,我可以检查CORBA生成的代码并使用它来生成其他代码。但是,由于C ++没有反射,我不知道如何在C ++方面做到这一点。我应该使用C ++解析器吗? C ++模板?
TLDR:如何使用生成的C ++代码作为输入生成C ++代码?
答案 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,除了作为一个独立的编译器之外,它还可以在你描述的情况下用作库。它将为您提供解析树,您可以在其上进行分析和转换