0

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

...
myfunc(1);
...

或者

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

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

4

3 回答 3

0

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

但当然,您可以逐步搜索函数名称中允许的字符序列(即,必须以字母或下划线开头,后跟字母、下划线、数字等...),后跟左括号,或类似的东西线。

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

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

于 2012-07-24T02:02:30.883 回答
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);
于 2012-07-23T12:39:35.907 回答
0

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

于 2012-07-23T12:44:45.540 回答