如何从C源的Main()函数中提取函数名

时间:2010-10-24 10:16:38

标签: c++ function extraction

我只是想问一下你对此事的想法。由于某个重要原因,我必须提取/获取在C源文件(例如:main.c)的“main()”函数内调用的函数的所有函数名。

示例源代码:

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

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

到目前为止,我知道你在说什么,这是一个很痛苦的$$$ ...所以请分享你的想法和想法...并在这一个上忍受我......

注意:这是用C ++语言编写的......

3 个答案:

答案 0 :(得分:3)

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

  1. 采用C ++的语法
  2. 使用上述工具生成C ++程序解析器
  3. 让该程序计算您提到的函数
  4. 对于你需要做的事情,可能有点过于复杂,但它确实应该有效。 LEX / YACC是很棒的工具!

答案 1 :(得分:2)

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

适用于100%的选项是将#include文件编译为程序集文件,例如: .c,并在gcc -S file.c中查找call条说明。类似的选项是将file.S文件编译为目标文件,例如.c,生成包含gcc -c file.c的反汇编转储,并搜索objdump -d file.o条指令。

另一个选择是使用Clang / LLVM找到解析器。

答案 2 :(得分:2)

gnu cflow可能会有所帮助