有哪些好工具可以快速开始解析和分析C/C++代码?

具体地说,我正在寻找处理C/C++预处理器和语言的开源工具.这些工具最好使用lex/yacc(或flex/bison)作为语法,并且不要太复杂.它们应该处理最新的ANSI C/C++定义.

以下是我到目前为止的发现,但还没有详细研究( idea ?):

  • CScope台老式C分析仪.不过,似乎没有做完整的解析.描述为用于查找C函数的美化的"grep".
  • GCC-大家最喜欢的开源编译器.非常复杂,但似乎都能做到.有一个创建GCC扩展名为GEM的相关项目,但自GCC 4.1(2006)以来一直没有更新过.
  • PUMA-纯机械手.(摘自页面:"本项目的目的是
  • 各种C/C++原始语法.你可以拿到c-c++-grammars-1.2.tar.gz美元,但这从1997年起就没有维护过了.稍微在Google上搜索一下,就会调出其他基本的lex/yacc语法,可以作为起点.
  • 还有别的吗?

我希望以此为起点,将C/C++源代码翻译成一种新的玩具语言.

谢谢! -哑光

(增加了2/9):我只是想澄清一下:除了C/C++代码本身之外,我还想从预处理器中提取语义信息.我不希望"#定义foo42"消失在整数"42"中,而是保持与"foo"这个名称的关联.不幸的是,这排除了几个首先运行预处理器并且只提供C/C++解析树的解决方案)

推荐答案

解析C++是非常困难的,因为语法是无法确定的.引用Yossi Kreinin句话:

极其复杂的语法

"卓越"应该被字面解释,因为all popular languagescontext-free(或几乎"无上下文"的文法),而C++有undecidable的语法.如果你喜欢编译器和解析器,你可能知道这意味着什么.如果你不喜欢这类东西,有一个simple example显示了解析C++的问题:AA BB(CC);是对象定义还是函数声明?事实证明,答案在很大程度上取决于语句的代码"上下文".这表明(直觉上)C++语法对上下文非常敏感.

C++相关问答推荐

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

从C函数调用asm函数时生成错误的BLX指令(STM32H753上的gcc)

POSIX文件描述符位置

通过MQTT/蚊子发送大文件—限制在4MB

编译SDL 2时缺少SDL_ttf

使用额外的公共参数自定义printf

难以理解Makefile隐含规则

C:fopen是如何实现二进制模式和文本模式的?

用C宏替换strncMP函数中的参数

在另一个函数中使用realloc和指针指向指针

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

我在反转双向链表时遇到问题

按长度对argv中的单词进行排序

是否定义了此函数的行为?

Wcstok导致分段故障

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

生成一个半RNG,结果用C表示(无随机/随机)

使用 GCC 将一个函数中初始化的 struct 体实例通过指针传递到 C 中的另一个函数会产生不同的结果

在 C/C++ 中原子按位与字节的最佳方法?

我该如何处理这个 C 90 代码中的内存泄漏?