我只是想问一下你对此事的想法。由于某个重要原因,我必须提取/获取在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 ++语言编写的......
答案 0 :(得分:3)
您可以通过组合FLEX(或LEX)和BISON(或YACC)来编写Small C ++解析器。
对于你需要做的事情,可能有点过于复杂,但它确实应该有效。 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
可能会有所帮助