![]() |
1
34
解析C++非常困难,因为语法是不可判定的。引用 Yossi Kreinin :
|
![]() |
3
17
|
![]() |
4
16
根据您的问题 GCCXML 这可能是你的答案。 基本上,它使用GCC解析源代码,然后为您提供易于理解的XML解析树。 使用GCCXML,您将一劳永逸。 |
![]() |
5
14
pycparser 是用Python编写的C(C99)的完整解析器。它有一个完全可配置的AST后端,因此它被用作您可能需要的任何语言处理的基础。 不支持C++。当然,这是 很 比C更难。 更新(2012) :毫无疑问,此时的答案是 Clang -它是模块化的,支持完整的C++(具有许多C++11特性),并且具有相对友好的代码库。它还有一个C API,用于绑定到高级语言(即。 for Python ). |
![]() |
6
8
|
![]() |
7
7
Parsing C++ is a very complex challenge . 有Boost/Spirit框架,几年前他们也有 play with the idea of implementing a C++ parser ,但它是 far from complete . 完全正确地解析ISO C++绝非易事,事实上有许多相关的工作。但这是一项固有的复杂工作,如果不重写一个理解所有C语言的完整编译器前端,就不容易完成++ 和 预处理器。Spirit团队提供了一种名为“wave”的预处理器实现。 也就是说,你可能想看看 pork/oink (基于elsa),这是一个专门用于源代码转换的C++解析器工具包,它正被Mozilla项目用于进行大规模的静态源代码分析和自动代码重写,最有趣的是它不仅支持大多数C++,还支持预处理器本身! 另一方面,确实有一个专有的解决方案可用:EDG前端,它可以用于几乎所有与C++相关的工作。 就我个人而言,我想看看Mozilla使用的基于elsa的pork/oink套件,除此之外,FSF现在已经批准了 gcc plugins 使用运行时库许可证,因此我认为,一旦人们可以使用二进制插件轻松地利用基于gcc的C++解析器来实现这些目的,事情就会迅速发生变化。 所以,简而言之:如果你有钱:EDG,如果你需要一些免费/开源的东西 现在 :else/oink相当有前途,如果你有时间,你可能想在你的项目中使用gcc。 C代码的另一种选择是 cscout . |
![]() |
8
6
众所周知,C++的语法有点多毛。有 a good thread at Lambda about it, 但要点是C++语法可能需要任意多的前瞻性。 对于我想象中你可能正在做的事情,我会考虑黑客攻击Gnu CC,或者 Splint Gnu CC确实非常彻底地分离了语言生成部分,所以你最好构建一个新的g++后端。 |
![]() |
9
4
实际上,PUMA和AspectJ仍然在积极维护和更新。我正在考虑使用AspectJ,并对自己缺乏更新感到疑惑。我给作者发了一封电子邮件,他说AspectJ和PUMA仍在开发中。您可以通过SVN获取源代码 https://svn.aspectc.org/repos/ 或者,您可以在以下网址获得常规二进制构建 http://akut.aspectc.org 与当今许多优秀的c++项目一样,作者没有时间跟上网页维护的步伐。如果你有全职工作和生活,这是有道理的。 |
![]() |
10
4
|
![]() |
12
2
查看我们的 C++ Front End 对于一个功能齐全的C++解析器:构建AST、符号表、命名 以及类型分辨率。您甚至可以解析并保留预处理器 指令。C++前端构建在我们的 DMS Software Reengineering Toolkit ,这允许您使用该信息进行任意操作 使用源代码到源代码转换更改源代码。 DMS是实现这种翻译器的理想引擎。 话虽如此,我认为你想象的任务没有多大意义;我不 看到试图取代C++的巨大价值,你会发现构建 一个完整的翻译需要大量的工作,尤其是如果你 目标是一种“玩具”语言。而且,这可能没什么意义 如果C++的唯一目的是生成 C++的同构版本,更容易解析(等等,我们假设 一个强大的C++!). 2012年5月编辑:DMS的C++前端现在处理GCC3/GCC4/C++11,微软VisualC 2005/2010。稳健。 2015年2月编辑:现在处理GCC和MS方言的C++14。 2015年8月编辑:现在解析并捕获统一树中的代码和预处理器指令。 2020年5月编辑:在过去的几年里一直在做C++17。C++20正在开发中。 |