2

我只是想问问你对这件事的看法。出于某种重要原因,我必须提取/获取在 C 源文件的“main()”函数中调用的函数的所有函数名称(例如:main.c)。

示例源代码:

int main()
{
    int a = functionA(); // functionA must be extracted
    int b = functionB(); // functionB must be extracted
}

如您所知,我唯一可以用作标记/符号来识别这些函数调用的是括号“()”。在实现这个函数名提取时,我已经考虑了几个因素。它们是:
1. 函数可能有参数。例如:functionA(100)
2. 循环运算符。例如:while() 3. 其他运算符。例如:if(), else if() 4. 函数调用之间没有空格的其他运算符。例如:函数A()+函数B()

此刻我知道你在说什么,这是$$$$的痛苦......所以请分享你的想法和想法......并在这个问题上容忍我......

注意:这是在 C++ 语言中...

4

3 回答 3

3

您可以通过结合 FLEX(或 LEX)和 BISON(或 YACC)来编写小型 C++ 解析器。

  1. 以 C++ 的语法为例
  2. 使用上述工具生成 C++ 程序解析器
  3. 让该程序计算您提到的函数调用

对于您需要做的事情来说可能有点太复杂了,但它肯定可以工作。LEX/YACC 是很棒的工具!

于 2010-10-24T10:20:14.510 回答
2

一种选择是编写自己的 C 标记器(简单:只要小心跳过字符串、字符常量和注释),然后编写一个简单的解析器,它计算{打开的 s 的数量,并在其中找到标识符 + 的实例(。但是,这不会是 100% 正确的。此选项的缺点是实现预处理器指令(例如#include#define)很麻烦:可以从文件getchar中定义的宏(例如 )调用函数。#include

一个适用于 100% 的选项是将您的.c文件编译为汇编文件,例如gcc -S file.c,并callfile.S. 一个类似的选项是将您的.c文件编译为目标文件,例如,gcc -c file.c使用 生成反汇编转储objdump -d file.o,并搜索call指令。

另一种选择是使用 Clang / LLVM 查找解析器。

于 2010-10-24T10:26:58.053 回答
2

gnucflow可能会有所帮助

于 2010-10-24T10:38:46.777 回答