从C文件中的函数调用中提取函数名称

时间:2012-07-23 11:59:22

标签: ruby regex

是否可以在C源文件中提取函数调用,例如,

...
myfunc(1);
...

...
myfunc(anotherfunc(1, 2));
....  

只使用Ruby正则表达式?如果没有,像ANTLR这样的解析器生成器是否有用?

3 个答案:

答案 0 :(得分:0)

这不是用于查找方法调用的完全证明模式,而是应该只提供您感兴趣的模式。

[a-zA-Z\s]*\([a-zA-Z0-9]*(\([a-zA-Z0-9\s]*[\s,]*[\sa-zA-Z0-9]*\))?\);

此正则表达式将匹配以下方法调用模式。

1. myfunc(another(one,two));
2. myfunc();
3. myfunc(another());
4. myfunc(oneArg);

答案 1 :(得分:0)

您还可以使用已经使用emacs编写的正则表达式 - imenu,etags,ecb,c-mode等。

答案 2 :(得分:0)

从最纯粹的意义上说,你不能,因为递归嵌套函数调用的可能性使它成为非常规语言。也就是说,您不能编写与任意函数调用匹配的正则表达式,并提取所有包含的函数名称。

但是当然你可以逐步搜索函数名中允许的字符序列(即,必须以字母或下划线开头,后跟字母,下划线,数字等......)后跟左括号,或者这些方面的东西。

但请记住,任何此类方法都容易出错:如果在评论中引用了某个函数会怎么样?如果它出现在字符串常量内怎么办?实际上,要捕获所有特殊情况,您必须(几乎)正确解析完整的C文件。

大多数现代正则表达式引擎都具有解析比常规语言更多的功能,例如通过对子表达式的反向引用。但你不应该走那条路。使用适当的解析器(如ANTLR)可以解析无上下文的语言,您将使自己的生活变得更加轻松。