是否有任何免费工具可以帮助自动生成代码?

时间:2009-09-21 19:23:49

标签: c++ code-generation

几个学期回来我有一个课,我们写了一个非常基本的方案解析器,最后是一个解释器。在课程结束后,我将我的解析器转换为C ++解析器,只要我没有对预处理器或宏做任何事情,我就可以很好地解析C ++。我可以用它来读取我的类和函数,并做一些巧妙的事情,比如自动生成类读者或编写器,或者从文本文件中设置函数回调。

但是,我的计划非常有限。我确信我可以花一些时间来使它更健壮并做更多整洁的事情,但如果已经有更强大的工具可以做同样的事情,我不想花费时间和精力。我认为必须有这样的东西,因为解析器是编译器的重要组成部分,但我还没有看到专门用于自动代码生成的工具,这使得它很容易通过并使用代表类,函数和数据的数据结构。特别是C ++的变量。是否有工具可以做到这一点?

编辑:

希望这能澄清我正在寻找的一点点。我在Visual Studio中作为预建步骤运行的程序。它读取我的源文件,列出类,它们的成员,它们的功能等,然后用它们来生成新的代码。目前我只是使用它来轻松读取和写入我的数据结构到纯文本文件,但我也可以做其他事情。文件读取器和编写器输出到普通的.cpp和.h文件中,我将其包含在项目的其余部分中,就像我任何其他文件一样。我正在寻找的是做类似事情的工具,所以我可以决定是继续使用自己的还是转而使用更好的解决方案。我不是在寻找任何可以生成机器代码或编辑代码的东西。

8 个答案:

答案 0 :(得分:6)

如果你想从头开始解析C ++,那么像ANTLR或YACC这样的完整解析器构建工具是必要的,但它对你的目的来说太过分了。

它读取我的源文件,列出类,它们的成员,它们的函数等,然后用它们来生成新的代码。

两个主要选项:

  • GCC-XML可以生成类,成员和函数的列表。他们网站上的发行版很老了;尝试CVS版本。我不知道Windows端口的可用性。
  • Doxygen旨在生成文档,但它也可以生成XML输出,您应该可以使用它来执行您想要的操作。

目前我只是用它来轻松读取和编写我的数据结构到纯文本文件......

这称为序列化。试试Boost.Serializationlibs11nGoogle Protocol BuffersStack Overflow进一步讨论。

...但我也可以做其他事情。

这种自动代码生成的其他很酷的应用包括反射(在运行时检查对象的成员,使用带有C ++的duck typing等)并生成用于从脚本语言调用C ++的包装器。有关C ++反射库,请参阅Reflex。有关为脚本语言生成包装器的示例,请参阅Boost.PythonSWIG

答案 1 :(得分:2)

C++ FAQ Lite引用了C ++的YACC语法。 YACC是一个老式的解析器,用于生成解析器输出,笨拙且难以学习但非常强大。如今,您使用Gnu Bison代替YACC。

答案 2 :(得分:2)

不要忘记Cog。它需要你了解Python。本质上,它将Python脚本的输出嵌入到您的代码中。它的使用非常简单,但它与ANTLR之类的方法完全不同,其目的有所不同。

答案 3 :(得分:1)

也许Boost :: Serialize或ANTLR?

答案 4 :(得分:1)

answered提出类似问题(将源文件拆分为单独的标头和cpp文件),建议使用lzz

lzz有一个非常强大的C ++解析器,可以为除函数体之外的所有东西构建表示。只要您不需要函数体的内容,就可以修改“lzz”,以便它执行您想要的生成步骤。

答案 5 :(得分:1)

如果您需要可以解析生产C ++代码并执行任意分析和转换的工具,请参阅我们的DMS Software Reengineering Toolkit及其C++ front end

使用DMS可以提供​​的关于C ++代码,其结构,类型,实例的信息来生成这样的访问函数将是直截了当的。如果您想用另一种语言生成访问函数,DMS提供了将输入语言(在本例中为C ++)转换为该目标语言的代码的方法。

答案 6 :(得分:0)

Mozilla为这类事情开发了Pork。我不能说它易于使用(甚至构建),但它正在生产中。

答案 7 :(得分:0)

我已经专业地使用Velocity引擎和C#作为编码的前一步,效果非常好。