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.)
答案 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]*\{