以编程方式识别功能体

Posted

技术标签:

【中文标题】以编程方式识别功能体【英文标题】:Function body identification in programmatically 【发布时间】:2014-10-09 12:02:40 【问题描述】:

我正在尝试创建自动化工具以在函数体上方插入注释行。想法是,我将 .CPP 文件作为文本读取并找到函数体。在 .CPP 文件中找到函数体后,我会将函数头放在函数体上方。

文件的读写与普通文本文件类似,但我想知道通用的函数体定义。 IE。我将如何以编程方式在 .CPP 文件中找到函数体。否则还有其他方法可以将函数头放在函数体之上。

谢谢。

【问题讨论】:

可能挂在某些 C++ 解析器中(例如 clang)? @Niall:感谢您的回复,但您能否提供一些关于您所说的解析器的想法。我是自动化方面的新手。:) 您可以确定 的位置,如果它前面没有使用它的其他东西,例如iffor 或其他什么,那么它就是一个函数身体? 另外,您能否编辑一个示例来说明您要实现的目标。就我个人而言,我很难理解你的目标。 clang.llvm.org/docs/Tooling.html 是一个不错的起点,然后可能是 clang 格式化程序的代码作为示例? 【参考方案1】:

这是一个想法:

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

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.*?[12]+?.*?0", quoteChar, openB, closeB),match => new string('#', match.Value.Length));
        goout = braceMatch(testS,openB,closeB);
    
    return str.Substring(0, index + 1);

【讨论】:

for 循环呢?或while 循环。或if。还是因为我喜欢它而大括号和它几乎做同样的事情?我知道有人在每一行代码上都加上括号,因为他不知道更好。一切都在该行的范围内,但编译的怪物。 好吧,我想第一个花括号将属于函数体的开头。此外,它匹配的花括号将是函数体的结尾...... 假设你只想匹配文件中的一个函数。 @Yann4 请检查源代码和解释。注意“匹配的右大括号”。 我并没有完全遵循goout = true 上面的内容,所以你可能是对的。

以上是关于以编程方式识别功能体的主要内容,如果未能解决你的问题,请参考以下文章

如何在WP7芒果中使用语音文本以编程方式使用内置的芒果语音功能

UG NX二次开发(C#)-模型处理功能

UG NX二次开发(C#)-模型处理功能

如何在 C 中以编程方式实现“tee”?

识别设备是不是为 Kindle

使用 FOSUserBundle 以编程方式记录用户以进行功能测试