【问题标题】:Python script to print all function definitions of a C/C++ file用于打印 C/C++ 文件的所有函数定义的 Python 脚本
【发布时间】:2010-12-09 21:39:08
【问题描述】:

我想要一个 python 脚本来打印 C/C++ 文件中定义的所有函数的列表。

例如abc.c 定义两个函数为:

void func1() { }
int func2(int i) { printf("%d", i); return 1; }

我只想搜索文件 (abc.c) 并打印其中定义的所有函数(仅限函数名称)。在上面的示例中,我想使用 python 脚本打印func1func2

【问题讨论】:

  • 你知道如何识别一个函数,问如何实现,还是问如何识别一个c函数def?

标签: python parsing string


【解决方案1】:

这个页面,Parsing C++,提到了一些 C++ 的 ANTLR 语法。由于ANTLR has a Python API,这似乎是一种合理的继续方式。

尽管解析可能看起来比正则表达式复杂得多,但在这种情况下,其他人几乎已经为您完成了所有工作,而您只需要从 Python 进行接口即可。

另一个替代方案是pygccxml,它利用了GCCXML,这是GCC 的一个输出扩展,可以从编译器内部表示生成XML,而其他人已经为您完成了解析C++ 的工作。由于 Python 有很好的 XML 支持,您只需要提取您感兴趣的信息。

【讨论】:

    【解决方案2】:

    要可靠地执行此操作,您需要解析 C 或 C++ 代码,然后从解析器生成的 AST 中获取函数定义。

    C 相当容易解析。正如pavpanchekha 提到的,解析器 PLY 带有一个 C 解析器,并已用于制作以下相关项目:

    解析 C++ 代码更复杂。"Is there a good Python library that can parse C++" 应该有帮助:

    众所周知,C++ 难以解析。大多数尝试正确执行此操作的人最终都会拆开编译器。事实上,这(部分)是 LLVM 开始的原因:Apple 需要一种可以解析 C++ 以在 XCode 中使用的方法,该方法与编译器解析它的方式相匹配。

    这就是为什么有像 GCC_XML 这样的项目可以与 python xml 库结合使用的原因。

    最后,如果您的代码根本不需要健壮,您可以通过代码重新格式化程序运行代码,例如 indent(用于 C 代码)以平衡事情,然后使用正则表达式匹配函数定义。是的,这是一个糟糕的、hacky、容易出错的想法,您可能会在多行 cmets 等中找到函数定义,但它可能工作得很好..

    【讨论】:

      【解决方案3】:

      我建议使用 PLY lex/yacc 工具。有一个预构建的 C 解析器,解析器本身非常快。解析完文件后,找到所有函数应该不会太难。

      http://www.dabeaz.com/ply/

      【讨论】:

        【解决方案4】:

        antlr 是你的工具

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-09
          • 1970-01-01
          • 2021-09-19
          • 2015-10-10
          • 2020-03-23
          • 1970-01-01
          • 1970-01-01
          • 2021-10-05
          相关资源
          最近更新 更多