在行计数程序中标识C#或C函数开始
作者:互联网
我有一个用C#编写的程序,当给定C或C#文件时,它会计算文件中的行数,并计算注释和设计师生成的代码块中的行数.我想添加一个功能来计算文件中有多少个函数以及这些函数中有多少行.我不太清楚如何确定一行(或几行)是否是函数(或方法)的开始.
至少,函数声明是返回类型,后跟标识符和参数列表.有没有一种方法可以在C#中确定令牌是有效的返回类型?如果不是,是否有任何方法可以轻松确定代码行是否是函数的开头?基本上,我需要能够可靠地区分类似的东西.
bool isThere()
{
...
}
从
bool isHere = isThere()
和从
isThere()
以及任何其他函数声明相似.
解决方法:
首先扫描示波器.在遍历文件时,您需要计算右括号{和右括号},以便知道所处的范围.扫描文件时还需要解析//和/ * … * / ,因此您可以判断注释中何时有内容,而不是真正的代码.还有#if,但是您必须编译代码才能知道如何解释它们.
然后,您需要在一些作用域大括号之前立即解析文本,以弄清楚它们是什么.您的函数可能在全局范围,类范围或名称空间范围内,因此您必须能够解析名称空间和类以标识您正在查看的范围类型.通常,您可以通过相当简单的解析就可以摆脱困境(大多数程序员使用类似的样式-例如,有人在’Fred类’和其大括号之间插入空白行是很罕见的.但是他们可能会写’Fred {类.他们也有可能在行上添加多余的垃圾,例如’template class __DECLSPEC MYWEIRDMACRO Fred {‘.但是,您可以逃脱一个非常简单的“行中是否包含单词’class’,并且两边都有空格?启发式将在大多数情况下有效.
好,现在您知道自己在名称空间中,并且在类中,并且找到了一个新的开放作用域.这是方法吗?
方法的主要识别功能是:
>返回类型.这可以是任何字符序列,也可以是许多标记(“ __DLLEXPORT const unsigned myInt32typedef *&”).除非您编译整个项目,否则您将没有机会.
>函数名称.单个令牌(但请注意“ operator =”等)
>一对包含零个或多个参数或“ void”的括号.这是你最好的线索.
>函数声明将不包含某些在许多范围之前的保留字(例如,枚举,类,结构等).而且它可能会使用一些保留字(模板,常量等),您不能跳过这些保留字.
因此,您可以搜索空白行或以;结尾的行; {或}表示上一个语句/作用域的结尾.然后获取该点和示波器的大括号之间的所有文本.然后提取标记列表,并尝试匹配参数列表括号.检查所有令牌都不是保留字(枚举,结构,类等).
这将为您提供一种“合理的信心度”,即您拥有一种方法.您不需要太多解析就可以获得很高的准确性.您可能会花费大量时间查找所有使“解析器”感到困惑的特殊情况,但是如果您使用的是合理一致的代码库(即仅是您自己公司的代码),则可能可以识别所有代码中的方法相当容易.
标签:token,c,c-4,function 来源: https://codeday.me/bug/20191210/2100920.html