Notepad ++的函数列表功能不正确

时间:2015-07-18 19:34:10

标签: c regex notepad++

Notepad ++有一个称为功能列表的内置功能,它显示当前文件中存在的功能名称。不幸的是,Notepad ++没有检测定义中具有函数指针的C函数:

//not detected
void A( void( *call )( void )  )
{

}

//ok
void B( void  )
{

}

记事本将这些规则存储在 functionList.xml 文件中,它有一个C函数规则:

    <parser id="c_function" displayName="C source" commentExpr="((/\*.*?\*)/|(//.*?$))">
        <function
            mainExpr="^[\t ]*((static|const|virtual)[\s]+)?[\w:]+([\s]+[\w]+)?([\s]+|\*[\s]+|[\s]+\*|[\s]+\*[\s]+)([\w_]+[\s]*::)?(?!(if|while|for))[\w_]+[\s]*\([^\)\(]*\)([\s]*const[\s]*)?[\n\s]*\{"
            displayMode="$functionName">
            <functionName>
                <nameExpr expr="(?!(if|while|for))[\w_~]+[\s]*\("/>
                <nameExpr expr="(?!(if|while|for))[\w_~]+"/>
            </functionName>
        </function>
    </parser>

正如你所看到的,正则表达式mainExpr相当长,我对正则表达式的理解还不足以在规则中包含函数指针。

C函数指针可能相当复杂,例如:

void ( *C( int a, void(*f)( int ) ) ) ( int )
{
    ( void )a;
    ( void )f;

    void(*b)( int ) = NULL;

    return b;
}

我正在寻找修改正则表达式规则的解决方案,以便它将检测示例函数A(如果可能还有C.)

1 个答案:

答案 0 :(得分:1)

为了匹配这些C函数,您可以尝试使用以下正则表达式:

^[\t ]*((static|const|virtual)[\s]+)?[\w:]+([\s]+[\w]+)?([\s]+|\*[\s]+|[\s]+\*|[\s]+\*[\s]+)([\w_]+[\s]*::)?(?!(if|while|for))([\w_]*[\s]*)\([^()]*(\([^()]*(\([^()]*\)[^()]*)*\))*[^()]*\)(\s*\([^()]*(\([^()]*(\([^()]*\)[^()]*)*\))*[^()]*\))*([\s]*const[\s]*)?[\n\s]*\{

问题是我们不能确定Notepad ++函数列表中的正则表达式是否支持递归。如果它确实支持递归,那么正则表达式会更安全:

^[\t ]*((static|const|virtual)[\s]+)?[\w:]+([\s]+[\w]+)?([\s]+|\*[\s]+|[\s]+\*|[\s]+\*[\s]+)([\w_]+[\s]*::)?(?!(if|while|for))([\w_]*[\s]*)(\s*\((?>[^()]|(?8))*\))*(\s*\((?>[^()]|(?9))*\))*([\s]*const[\s]*)?[\n\s]*\{