功能单元最大行数_第1页
功能单元最大行数_第2页
功能单元最大行数_第3页
功能单元最大行数_第4页
功能单元最大行数_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 文档名称:功能单元最大有效行数 作 者: 日 期: 1 分析 功能单元这里指的是函数,即整个项目中所有.c文件的函数的最大有效行数,针对找到的开源工具,有个可以利用:C and C+ Code Counter和makeheaders,其中C and C+ Code Counter在功能单元最大扇入扇出工具分析中已经介绍,其中有这样的功能,即列出所有函数的LOC。Makeheaders能够把.c文件中的全局变量和函数定义抽取出来,自动生成头文件。 因此一种思路是根据makeheaders和C and C+ Code Counter的代码抽取出来,在此基础上进行字符串的匹配,这种思路虽然可以实现

2、,但是不如解析c的语法来实现可靠。第二种方法即是基于c的语法分析来实现。 本文的主要目的就是介绍搜集到的常用的c的解析器。2 cscope2.1 简介度量工具名称cscope网址/操作方式命令行实现语言C+适用的操作系统Linux可以度量的属性LOC MVC COM LOC/COM MVG/COMFan-out Fan-in HKS NOM WMC REJ备注开源,有源代码,可分析后在基础上修改Cscope的功能通过它的子命令“find”来实现。cs find c|d|e|g|f|i|s|t name s:查找C代码符号 g:查找本定义

3、d:查找本函数调用的函数 c:查找调用本函数的函数 t:查找本字符串 e:查找本egrep模式 f:查找本文件 i:查找包含本文件的文件2.2工具优缺点总结 Cscope是AT&T官方发布的Unix的一部分,cscope 是一个 C 语言的浏览工具,通过这个工具可以很方便地找到某个函数或变量的定义位置、被调用的位置等信息。目前支持 C 和 C+。cscope 自身带一个基于文本的用户界面,不过 gvim 提供了cscope接口,因此可以在 gvim 中调用 cscope,方便快捷地浏览源代码。也可以使用单独的命令行。 缺点:linux平台下使用。在http:/iamphet.nm.ru/csc

4、ope/有Sergey Khorev预编译的一个Win32版本的cscope,这个版本的cscope可以很好的与windows版本的vim搭配使用。2.3 实例下面是一个最简单的将Cscope跑起来的例子。1.Cscope安装./configure make make install2. 建立符号数据库 cscope -Rbq 3. 运行cscope,出现下面菜单:Find this C symbol: Find this function definition: Find functions called by this function: Find functions calling th

5、is function: Find this text string: Change this text string: Find this egrep pattern: Find this file: Find files #including this file: 3 Flex+Bison3.1 简介度量工具名称Flex+Bison网址/software/bison/操作方式命令行实现语言C适用的操作系统Linux可以度量的属性备注一些介绍本工具的网址:/woaidongmao/archive/2008/11/23

6、/67635.html/woaidongmao/archive/2008/11/30/68226.html3.1.1 FLEX是一个自动化工具,可以按照定义好的规则自动生成一个C函数yylex(),也成为扫描器(Scanner)。这个C函数把文本串作为输入,按照定义好的规则分析文本串中的字符,找到符合规则的一些字符序列后,就执行在规则中定义好的动作(Action)。例如在规则中可以这样定义:如果遇到一个换行字符n,那么就把行计数器的值加一。Flex文件就是一个文本文件,内容包括定义好的一系列词法规则。文件的命名习惯上以小写字母l(L)来作为文件后缀。如

7、果为了清晰,也可以用.flx或者.flex作为文件的后缀名。Flex文件完成后,就执行下列命令:$ flex example.flex这个命令执行后将生成一个C文件,默认文件名为lex.yy.c。这个C文件主要内容就是函数yylex()的定义。如果要直接将这个文件编译成为一个可执行程序,还有一些要注意的地方。如果在Flex文件中没有提供main()函数的定义,那么这个C文件中不会有main()函数。此时单独编译这个C文件的时候,一定要加上-lfl的连接库参数;若提供了main()函数,就不必要提供这个连接库参数了。连接库libfl提供了一个缺省的main函数。缺省的main()函数中只是简单地

8、调用yyflex()函数,而自己提供的main()函数则可以根据需要加入许多其他的处理代码。3.1.2 Bisonbison 是替代yacc的语法分析程序生成器. yacc是 Yet Another Compiler Compiler的缩写. bison又是什么呐 是一个生成可以分析文本文件结构的程序的程序. 用户不用直接编写程序而只用确定好如何分析这些文本文件的规则就可以了. 这种文本结构应用的例子举不胜举, 其中一个就是计算器(calculator).给定一个字符串:1+2*3人可以马上计算出结果是7。为什么呢?因为结构。我们的大脑知道如何解释这个字符串。但是,计算机并不知道,Bison就

9、是一个通过将这个字串用如下方法提供给编译器以帮助计算机理解工具:+/*1/23从数的底部开始,遇到数2和3,它们通过乘法符号连接在一起,于是计算机将2和3进行乘积运算。计算结果暂时存储起来,然后计算机发现2*3的结果 与数1通过加法符号连接在一起。将前面的结果再加1就得到了7。在计算过程中,无论多复杂的计算也都能够分解成树形结构,计算机只需要从底层开始,一级一 级地向上计算,直到计算到最顶层就可以得到正确的答案。下面根据bison手册中的说明,给出一个完整的“中缀符号计算器”的bison输入文件语法规则文件(包括了词法分析器):calc.y/* Infix notation calculato

10、r. */ % #define YYSTYPE double #include #include #include #include int yylex (void); void yyerror (char const *); % /* Bison declarations. */ %token NUM %left - + %left * / %left NEG /* negation-unary minus */ %right /* exponentiation */ % /* The grammar follows. */ input: /* empty */ | input line ;

11、 line: n | exp n printf (t%.10gn, $1); ; exp: NUM $ = $1; | exp + exp $ = $1 + $3; | exp - exp $ = $1 - $3; | exp * exp $ = $1 * $3; | exp / exp $ = $1 / $3; | - exp %prec NEG $ = -$2; | exp exp $ = pow ($1, $3); | ( exp ) $ = $2; ; %/词法分析器int yylex (void) int c; /* Skip white space. */ while (c = g

12、etchar () = | c = t) ; /* Process numbers. */ if (c = . | isdigit (c) ungetc (c, stdin); scanf (%lf, &yylval); return NUM; /* Return end-of-input. */ if (c = EOF) return 0; /* Return a single char. */ return c; int main (void) return yyparse (); void yyerror (char const *s) fprintf (stderr, %sn, s);

13、 根据上面的语法规则文件(包括词法分析器),用bison生成计算器的代码:bison calc.y会产生calc.tab.c文件,编译calc.tab.c文件:cc -lm -o calc calc.tab.c就产生了calc可执行文件,运行示例如下:$ ./calc4 + 4.5 - (34/(8*3+-3)6.-56 + 2-543 293.2工具优缺点总结优点:功能强大,可以实现大所属的静态分析,而且具有很高的精度。 资料齐全。缺点:比较复杂,掌握起来有一些难度。3.3 实例创建一个简单的扫描器下列例子来自于Flex的手册。并在Windows+Cygwin+bison+flex+gcc的

14、环境下编译运行。(1) 编辑Flex语法文件。/* name: example.flex */int num_lines = 0, num_chars = 0;%n +num_lines; +num_chars;. +num_chars;%int main()yylex();printf(# of lines = %d, # of chars = %dn, num_lines, num_chars);return 0;(2) 生成扫描器的C文件。$ flex example.flexThe output is lex.yy.c4 Lemon4.1 简介度量工具名称Lemon网址http:/ww

15、/sw/lemon/lemon.html操作方式命令行实现语言C适用的操作系统Linux可以度量的属性备注Lemon是一个C或者C+语言的语法分析器生成器。它和“bison”与“yacc”的功能是一样的,但它不是“bison”或者 “yacc”的简单复制。为了减少编写代码的错误,它使用了一种不同的语法。Lemon使用了一种更为高级的分析引擎,运行速度比“bison”与 “yacc”要更快,并且该引擎是可重入的和线程安全的。更进一步的,Lemon实现了能够消除资源泄漏的特性,适合于长时间运行的程序例如GUI或者嵌 入式控制器中。下面是对lemon语法分析生成器的一个简介。操

16、作的原理lemon的主要目标是把一个特定语言的上下文无关文法(CFG)翻译成C语言实现的该语言的语法分析器。程序有两个输入:语法规范分析器模板文件典型的,程序员只需提供语法规范即可。Lemon自带了一个语法分析器模板,这对大多数的应用足够了。如果需要的话,用户可以替换一个新的分析器模板文件。根据命令行参数,Lemon会产生下面文件中的一个到三个:分析器的C语言代码;一个头文件,为每个终结符定义了一个整型ID;描述产生的语法分析器的状态的信息文件。默认情况下,上面的三个文件都会产生。如果使用了“-m”选项,则不会产生头文件;如果使用“-q”选项,信息文件则不会产生。语法规范文件是一个以“.y”为

17、后缀的文件。在文档的例子中,设定规范文件的名称是“gram.y”。典型的使用方式是:lemongram.y上面的命令会产生“gram.c”、“gram.h”、“gram.out”三个文件。第一个就是语法分析器,第二个就是为所有的终结符定义了数值的头文件,最后一个是分析器使用的状态自动机的说明。完整的源代码包含在两个文件中,lemon.c本身就是产生器本身。一个单独的文件lempar.c是lemon产生语法分析子程序需要的模板文件。也可获取lemon的有关文档。4.2工具优缺点总结 同Flex+Bison。4.3 实例5 makeheaders5.1 简介度量工具名称makeheaders网址h

18、ttp://sw/mkhdr/操作方式命令行实现语言C+适用的操作系统windows可以度量的属性备注 根据.c文件,自动生成包含全局变量和函数声明的头文件。4.2工具优缺点总结 此工具可以定位到.c文件中的所有函数,因此这部分代码可以利用,这是此工具的最大利用价值。只有一个源代码文件,因此比较简单。下面代码是针对找到的函数定义进行处理:static int ProcessMethodDef(Token *pFirst, Token *pLast, int flags) Token *pCode; Token *pClass; char *zDecl; Decl *p

19、Decl; String str; int type;/ printf(ntestxxxxn);/ pCode = pLast; pLast = pLast-pPrev; while( pFirst-zText0=P ) int rc = 1; switch( pFirst-nText ) case 6: rc = strncmp(pFirst-zText,PUBLIC,6); break; case 7: rc = strncmp(pFirst-zText,PRIVATE,7); break; case 9: rc = strncmp(pFirst-zText,PROTECTED,9); b

20、reak; default: break; if( rc ) break; pFirst = pFirst-pNext; pClass = FindDeclName(pFirst,pLast); if( pClass=0 ) fprintf(stderr,%s:%d: Unable to find the class name for this methodn, zFilename, pFirst-nLine); return 1; pDecl = FindDecl(pClass-zText, pClass-nText); if( pDecl=0 | (pDecl-flags & TY_Cla

21、ss)!=TY_Class ) pDecl = CreateDecl(pClass-zText, pClass-nText); DeclSetProperty(pDecl, TY_Class); StringInit(&str); if( pDecl-zExtra ) StringAppend(&str, pDecl-zExtra, 0); SafeFree(pDecl-zExtra); pDecl-zExtra = 0; type = flags & PS_PPP; if( pDecl-extraType!=type ) if( type & PS_Public ) StringAppend(&str, public:n, 0); pDecl-extraType = PS_Public; else if( type & PS_Protected ) StringAppend(&str, protected:n, 0); pDecl-extraType = PS_Protected; else if( type & PS_Private ) StringAppend(&str, private:n, 0); pDecl-extraType = PS_Private; StringAppend(&str, , 0); zDecl = TokensToString(pFirst,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论