繁体   English   中英

查找功能的正则表达式

[英]Regular expression for finding functions

所有C ++函数的形式均为

type name ( parameters ) { … } 

为了识别正则表达式,我正在使用

regex = "...";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(line);
if (matcher.matches())
{
    ...
}

我只能现实地搜索type name (部分原因是因为我使用的是行读取器,并且函数定义可以是多行,并且我不确定正则表达式是什么.*\\\\b.*\\\\( was我的最新猜测,但是没有用,我们将不胜感激。

不幸的是,没有可以匹配所有函数定义的通用正则表达式。

C ++语法规范允许您在任意变量的名称中加上任意数量的括号。 例如,你可以写

 int ((((((a))))));

声明一个名为a变量。 这意味着您可以定义如下功能:

void whyWouldYouDoThis(int (((((becauseICan)))))) {
   /* ... */
}

问题在于这意味着函数声明可以具有任意复杂的括号嵌套。 您可以证明,通常情况下,需要跟踪平衡括号的字符串集不能与正则表达式匹配(正式而言,这些字符串的语言不是正则表达式),不幸的是,这适用于此处。

这确实是人为设计的,但是在某些情况下,您会看到很多嵌套的括号。 例如,考虑以下功能:

void thisFunctionTakesACallback(void imACallbackFunction()) {
    /* ... */
}

这里,函数参数本身就是函数类型,这一事实引起了额外的括号。 如果函数接受了回调,您将看到类似以下内容:

void thisFunctionTakesACallback(void soDoesThisOne(void imACallbackInACallback())) {

     /* ... */
}

如果要查找所有函数声明,则最好使用解析器并为要查找的内容定义语法,因为这些模式与上下文无关。 您也可以考虑挂接到编译器前端(例如,g ++可以在GIMPLE或GENERIC框架中为您生成AST),然后使用它来提取所需的内容。 这样可以保证您不会错过任何东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM