查找函数名称并计算其 LOC

Posted

技术标签:

【中文标题】查找函数名称并计算其 LOC【英文标题】:finding a function name and counting its LOC 【发布时间】:2009-05-31 06:34:16 【问题描述】:

所以你知道,这是我被分配的一个项目。我不是在寻找代码中的答案,而是寻找一个方向。

我被告知要做的是浏览一个文件并计算实际的代码行数,同时记录函数名称和函数的各个代码行。我遇到的问题是在从文件中读取以确定该行是否是函数的开头时确定一种方式。

到目前为止,我只能想到可能有一个数据类型(int,double,char等)的字符串数组,在行中搜索然后搜索括号,然后搜索缺少的分号(所以我知道这不仅仅是函数的声明)。

所以我的问题是,我应该这样做吗,还是有其他方法可以推荐?

我将计算的代码将是 C++。

【问题讨论】:

虽然这是一个好的开始,但一方面你绝对不能确定 doesn't 行的末尾有分号。 int main() cout int main() cout 获取标准 SLOC 计数程序之一,它们中的大多数都这样做。我的答案中的链接。 使用 ctags 很容易找到函数的起始行: ctags -x --c++-kinds=f --language-force=c++ 。然后,您只需找到左大括号和右大括号。跳过 cmets 并不困难:您可以使用预处理器 (GNU cpp)。那么我认为只是计算 和 的问题 有效点,然而,这个项目更倾向于使用类似 PSP 的方法而不是解析的彻底性。因此,我很可能期望代码易于阅读,因此您提出的那些情况很可能不会发生。我可以很容易地检查一个';'成为括号后的第一件事,对吧? 【参考方案1】:

我想到了三种方法。

    使用正则表达式。这与您的想法非常相似。寻找看起来像函数定义的行。这样做相当快,但在很多方面都可能出错。

    char *s = "int main() "
    

    不是一个函数定义,但肯定看起来像一个。

    char
    * /* eh? */
    s
    (
    int /* comment? // */ a
    )
    // hello, world /* of confusion
    
    

    是一个函数定义,但看起来不像。

    好:写得很快,即使遇到语法错误也能工作;不好:很容易在看起来像(或看起来不像)“正常”情况的事情上失火。

    变体:首先通过例如 GNU 缩进运行代码。这将解决一些(但不是全部)失火问题。

    使用适当的词法分析器和解析器。这是一种更彻底的方法,但您可以重用开源词法分析器/解析器(例如,来自 gcc)。

    好:将 100% 准确(永远不会失火)。不好:少了一个分号,会报错。

    查看您的编译器是否有一些可能有帮助的调试输出。这是 (2) 的变体,但使用编译器的词法分析器/解析器而不是您自己的。

【讨论】:

我想我会使用正则表达式。除了python,我对他们没有任何经验,所以这应该是一个很好的机会。感谢您的想法。【参考方案2】:

您的想法可以在 99%(或更多)的情况下发挥作用。只有真正的 C++ 编译器才能做到 100%,在这种情况下,我将在调试模式下编译 (g++ -S prog.cpp),并从程序集输出的调试信息 (prog.s) 中获取函数名和行号。

我对 99% 解决方案的想法:

忽略 cmets 和字符串。 您忽略预处理器指令(#include#define#if)的文档。 ***之间的任何东西都是一个函数体,除了typedefclassstructunionnamespaceenum之后。 如果您有 classstructunion,则应该在其中查找方法主体。 函数名称有时很难找到,例如在long(*)(char) f(int);。 确保您的解析器使用模板函数和模板类。

【讨论】:

【参考方案3】:

对于记录函数名称,我使用PCRE 和正则表达式

"(?<=[\\s:~])(\\w+)\\s*\\([\\w\\s,<>\\[\\].=&':/*]*?\\)\\s*(const)?\\s*"

然后过滤掉“if”、“while”、“do”、“for”、“switch”等名称。请注意,函数名称是 (\w+),第 1 组。 当然,这不是一个完美的解决方案,而是一个很好的解决方案。

【讨论】:

【参考方案4】:

我觉得手动进行解析将是一项相当困难的任务。我可能会使用现有的工具,例如 RSM 将输出重定向到 csv 文件(假设您在 Windows 上),然后解析 csv 文件以收集所需的信息。

【讨论】:

【参考方案5】:

找到一个合适的 SLOC 计数程序,例如,SLOCCounter。您不仅可以计算 SLOC,而且还可以比较结果。 (更新:这里有一个long list。)

有趣的是,C/C++ 程序中非注释分号的数量是一个不错的 SLOC 计数。

【讨论】:

感谢那个链接,作为检查肯定会派上用场【参考方案6】:

写一个shell脚本来做这件事怎么样?也许是一个 AWK 程序。

【讨论】:

不能说我对那台自动取款机一无所知。我将不得不对此进行研究以供将来参考

以上是关于查找函数名称并计算其 LOC的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中,当我只知道一个函数名时如何查找数据库名称

pandas的loc与iloc

如何将df.loc []应用于多行并应用转换?

pandas使用方括号[]或者loc函数基于列名称或者列名称列表索引dataframe中的单个数据列或者多个数据列(accessing columns of a dataframe)

【速求C/C++】制作一个图书馆管理系统,其功能包括增加、删除、修改图书、图书统计、查阅图书、借书、还书

rust替换函数名