以编程方式识别中的函数体

本文关键字:函数体 识别 编程 方式 | 更新日期: 2023-09-27 18:26:05

我正在尝试创建一个自动化工具,在函数体上方插入注释行。想法是,我将以文本形式阅读.CPP文件,并找到函数体。一旦在.CPP文件中找到函数体,我就会把函数头放在函数体上面。

文件的读取和写入将类似于普通文本文件,但我想知道广义函数体的定义。也就是说,我将如何以编程方式在.CPP文件中找到函数体。除此之外,还有其他选择,可以将函数头放在函数体之上。

谢谢。

以编程方式识别中的函数体

以下是想法:

查找第一个大括号{。然后找到匹配的右大括号。重复

public List<string> FindFunctions(string str)
{
    var ret = new List<string>();
    var position = 0;
    var goout = false;
    while (!goout)
    {
        position = str.IndexOf("{", position);
        if (position == -1)
            break;
        var str1 = GetBracedString(str.Substring(position), '{', '}','"');
        position += str1.Length;
        ret.Add(str1);
    }
    return ret;
}


public String GetBracedString(string str, char openB, char closeB, char quoteChar)
{
    int i = 0;
    var goout = false;
    int index = -1;
    var isUnpairedQoute = new Func<string, char, bool>((s, q) => s.Count(x => x == q)%2 == 1);
    var braceMatch = new Func<string, char, char, bool>((s,o,c) => s.Count(x => x == o) == s.Count(x => x == c));
    while (!goout)
    {
        index = str.IndexOf(closeB, index + 1);
        var testS = str.Substring(0, index + 1);
        index = isUnpairedQoute(testS,quoteChar) ? str.IndexOf(quoteChar, index) : index;
        testS = str.Substring(0, index + 1);
        testS = Regex.Replace(testS, String.Format("{0}.*?[{1}{2}]+?.*?{0}", quoteChar, openB, closeB),match => new string('#', match.Value.Length));
        goout = braceMatch(testS,openB,closeB);
    }
    return str.Substring(0, index + 1);
}