2009-09-21 38 views
3

几个学期回来我有一堂课,我们写了一个非常基本的方案解析器,最终是一个解释器。课后,我将解析器转换为C++解析器,只要我没有对预处理器或宏执行任何操作,就可以很好地解析C++。我可以用它来读取我的类和函数,并做一些简洁的事情,例如自动生成类读取器或编写器,或者从文本文件中设置函数回调。有没有免费的工具来帮助自动生成代码?

但是,我的程序非常有限。我相信我可以花一些时间让它变得更加健壮,做更多漂亮的事情,但是如果已经有更强大的工具可以做同样的事情,我不想花费时间和精力。我认为必须有这样的东西,因为解析器是编译器的重要组成部分,但是我没有看到专门用于自动代码生成的工具,可以轻松地处理代表类,函数和特定于C++的变量。有没有工具可以做到这一点?

编辑:

希望这会澄清什么我正在寻找一点点。我在Visual Studio中作为预建步骤运行该程序。它读取我的源文件,创建一个类的列表,它们的成员,它们的函数等等,然后用它来生成新的代码。目前我只是用它来简化读写我的数据结构到纯文本文件,但我也可以做其他事情。文件读取器和编写器会输出到纯文本格式的.cpp和.h文件中,这些文件包含在我的项目的其余部分中,就像其他文件一样。我在寻找的是能够做类似事情的工具,所以我可以决定是否应该继续使用我自己的产品或切换到更好的解决方案。我没有寻找任何能够生成机器码或编辑我写的代码的东西。

+1

我想这取决于水平。你可以说编译器执行自动机器代码生成。 :-) – xpda 2009-09-21 19:28:57

+2

为了扩大xpda的评论,你想要生成什么? UI代码(平台?),ORM绑定,数据库模式,业务逻辑验证等。 – 2009-09-21 19:32:05

+0

听起来像他想要一个解析器甚至编译器生成器,为他提供了一个框架来改变C++的行为。 – 2009-09-21 19:37:32

回答

6

像ANTLR或者YACC一个完整的解析器建设的工具是必要的,如果你想从头解析C++,但它是矫枉过正为您的目的。

它读了我的源文件,使类,他们的成员,他们的功能等,然后用于生成新的代码清单。

两个主要选项:

  • GCC-XML可以生成的类,成员和函数的列表。他们网站上的发行版本比较陈旧,试试CVS版本。我不知道Windows端口的可用性。
  • Doxygen是为生成文档而设计的,但它也可以生成XML输出,您应该可以使用它来做你想做的事情。

目前我只是用它来使之易于阅读,我的数据结构写入到一个纯文本文件...

这就是所谓的序列化。尝试Boost.Serialization或者libs11nGoogle Protocol BuffersStack Overflow有进一步的讨论。

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

+1

谢谢。为了记住GCC-XML的名字,我一直在敲我的脑袋10分钟! – Duck 2009-09-21 20:14:46

2

C++ FAQ Lite提到了C++的YACC语法。 YACC是一个老派的解析器,用于生成解析器输出,笨拙而难于学习,但功能非常强大。现在,你会使用Gnu Bison而不是YACC。

+0

GNU的人放弃了使用Bison来解析C和C++。 – 2009-09-30 09:02:26

+0

大概是个好主意。确切地说,为什么C语法是我可能永远不会知道的方式。 – 2009-09-30 20:01:03

2

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

0

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

1

answered一个类似的问题(再分割源文件到单独的头和cpp文件)通过建议使用lzz

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

0

我已经用专业的Nvelocity引擎与C#结合,作为编码的一个预先步骤,具有非常好的结果。

相关问题