我正在努力组合一个正则表达式来匹配如下的函数调用:
funcname (...(..
...)..(..(...
)...)..)
因此该函数可以有多个括号内的参数分布在多行上。
点可以是任何来自 '(' 或 ')' 的东西。
我会将正则表达式与 sed 或 grep 一起使用。
谢谢,里斯托
我正在努力组合一个正则表达式来匹配如下的函数调用:
funcname (...(..
...)..(..(...
)...)..)
因此该函数可以有多个括号内的参数分布在多行上。
点可以是任何来自 '(' 或 ')' 的东西。
我会将正则表达式与 sed 或 grep 一起使用。
谢谢,里斯托
所以,我继续用 bash 编写这个简单的解析器。它并不完美,但可以作为一个起点。例如,它无法区分函数调用是否被注释掉等。
while read file; do
linenum=0
while IFS= read -r line; do
(( linenum++ ))
if [ $fmatch -eq 0 ]; then
if [[ ! $line =~ $funcname ]]; then
continue
fi
linenummatch=$linenum
fmatch=1
fstripped=0
openbracket=0
closebracket=0
spacenum=0
fi
linelen=${#line}
position=0
while [ $position -lt $linelen ]; do
if [ $fstripped -eq 0 ]; then
subline=${line:$position}
mlen=`expr "$subline" : "$funcname"`
if [ $mlen -gt 0 ]; then
(( position+=mlen ))
resultstr=$funcname
fstripped=1
continue
fi
(( position++ ))
continue
fi
ch=${line:$position:1}
case $ch in
'(' )
(( openbracket++ ))
spacenum=0
newresultstr="$resultstr$ch"
;;
')' )
if [ $openbracket -eq 0 ]; then
fmatch=0
break
fi
(( closebracket++ ))
spacenum=0
newresultstr="$resultstr$ch"
if [ $closebracket -eq $openbracket ]; then
echo "$file $linenummatch $newresultstr"
fmatch=0
break
fi
;;
' ' | '\t' )
if [ $spacenum -eq 0 ]; then
newresultstr=$resultstr' '
fi
(( spacenum++ ))
;;
'\n' )
# line feeds are skipped
;;
* )
if [ $openbracket -eq 0 ]; then
fmatch=0
break
fi
spacenum=0
newresultstr="$resultstr$ch"
;;
esac
resultstr=$newresultstr
(( position++ ))
done
done < $file
done < $filelist
由于 C 是一种不规则语言,因此您可能需要一个解析器。当所有开括号再次关闭时,您将遇到的问题是。你可以用 C 做一些相当奇怪的事情。例如,你可以有一个参数,它本身就是一个函数定义。例如,考虑在以下程序中如何区分 a()、b()、c()、d()、e()、f() 和 g()?
#include <stdio.h>
#define f(c) c;
char a()
{
return f('z');
}
/*
A function in a comment.
char b()
{
return 'y';
}
*/
char c(char d())
{
return d();
}
#if 0
This code is not included
char g()
{
return 'v';
}
#endif
void main()
{
printf ("A function in a string: char e() { return 'x'; }\n");
printf ("The result from passing a to c: %c\n", c(a));
printf ("Press enter to exit");
getchar();
}
我已经看到很多尝试用正则表达式做这种事情,但大多数都以灾难性的回溯问题告终。