1

我正在努力组合一个正则表达式来匹配如下的函数调用:

funcname (...(..
    ...)..(..(...
    )...)..)

因此该函数可以有多个括号内的参数分布在多行上。

点可以是任何来自 '(' 或 ')' 的东西。

我会将正则表达式与 sed 或 grep 一起使用。

谢谢,里斯托

4

2 回答 2

0

所以,我继续用 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
于 2012-08-06T15:46:16.060 回答
0

由于 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();
}

我已经看到很多尝试用正则表达式做这种事情,但大多数都以灾难性的回溯问题告终。

于 2012-08-03T12:24:11.343 回答