是否可以在C源文件中提取函数调用,例如,
...
myfunc(1);
...
或
...
myfunc(anotherfunc(1, 2));
....
只使用Ruby正则表达式?如果没有,像ANTLR这样的解析器生成器是否有用?
答案 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)可以解析无上下文的语言,您将使自己的生活变得更加轻松。