功能單元最大行數(shù)模板_第1頁
功能單元最大行數(shù)模板_第2頁
功能單元最大行數(shù)模板_第3頁
功能單元最大行數(shù)模板_第4頁
功能單元最大行數(shù)模板_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、文檔名稱:功能單元最大有效行數(shù)作者:日期:1分析功能單元這里指的是函數(shù),即整個項目中所有.c文件的函數(shù)的最大有效行數(shù),針對找到的開源工具,有個可以利用:CandC+CodeCounter和makeheaders其中CandC+CodeCounter在功能單元最大扇入扇出工具分析中已經(jīng)介紹,其中有這樣的功能,即列出所有函數(shù)的LOCMakeheaders能夠把.c文件中的全局變量和函數(shù)定義抽取出來,自動生成頭文件。因此一種思路是根據(jù)makeheader4口CandC+CodeCounter的代碼抽取出來,在此基礎上進行字符串的匹配,這種思路雖然可以實現(xiàn),但是不如解析c的語法來實現(xiàn)可靠。第二種方法即

2、是基于c的語法分析來實現(xiàn)。本文的主要目的就是介紹搜集到的常用的c的解析器。2cscope2.1簡介度量工具名稱cscope網(wǎng)址操作方式命令行實現(xiàn)諦言C+適用的操作系統(tǒng)Linux可以度量的屬性LOCMVCCOMLOC/COMMVG/COMFan-outFan-inHKSNOMWMCREJ備注開源,有源代碼,可分析后在基礎上修改Cscope的功能通過它的子命令“find”來實現(xiàn)。csfindc|d|e|g|f|i|s|tname s:查找C代碼符號 g:查找本定義 d:查找本函數(shù)調(diào)用的函數(shù) c:查找調(diào)用本函數(shù)的函數(shù) t:查找本字符串 e:查找本egrep模式 f:查找本文件 i:查找包含本文件的文

3、件2.2 工具優(yōu)缺點總結Cscope是AT&T官方發(fā)布的Unix的一部分,cscope是一個C語言的瀏覽工具,通過這個工具可以很方便地找到某個函數(shù)或變量的定義位置、被調(diào)用的位置等信息。目前支持C和C+。cscope自身帶一個基于文本的用戶界面,不過gvim提供了cscope接口,因此可以在gvim中調(diào)用cscope方便快捷地瀏覽源代碼。也可以使用單獨的命令行。缺點:linux平臺下使用。在http:/iamphet.nm.ru/cscope有SergeyKhorev預編譯的一個Win32版本的cscope,這個版本的cscope可以很好的與windows版本的vim搭配使用。2.3 實

4、例下面是一個最簡單的將Cscope跑起來的例子。1.Cscopel5裝./configuremakemakeinstall2.建立符號數(shù)據(jù)庫cscope-Rbq3.運行cscope,出現(xiàn)下面菜單:FindthisCsymbol:Findthisfunctiondefinition:Findfunctionscalledbythisfunction:Findfunctionscallingthisfunction:Findthistextstring:Changethistextstring:Findthisegreppattern:Findthisfile:Findfiles#includin

5、gthisfile:3Flex+Bison3.1簡介度量工具名稱Flex+Bison網(wǎng)址/software/bison/操作方式命令行實現(xiàn)諦言C適用的操作系統(tǒng)Linux可以度量的屬性備注一些介紹本工具的網(wǎng)址:3.1.1 FLEX是一個自動化工具,可以按照定義好的規(guī)則自動生成一個C函數(shù)yylex(),也成為掃描器(Scanner)。這個C函數(shù)把文本用作為輸入,按照定義好的規(guī)則分析文本用中的字符,找到符合規(guī)則的一些字符序列后,就執(zhí)行在規(guī)則中定義好的動作(Action)。例如在規(guī)則中可以這樣定義:如果遇到一個換行字符n,那么就把行計數(shù)器的值加一。Flex文件就是一個

6、文本文件,內(nèi)容包括定義好的一系列詞法規(guī)則。文件的命名習慣上以小寫字母l(L)來作為文件后綴。如果為了清晰,也可以用.flx或者.flex作為文件的后綴名。Flex文件完成后,就執(zhí)行下列命令:$flexexample.flex這個命令執(zhí)行后將生成一個C文件,默認文件名為lex.yy.c。這個C文件主要內(nèi)容就是函數(shù)yylex()的定義。如果要直接將這個文件編譯成為一個可執(zhí)行程序,還有一些要注意的地方。如果在Flex文件中沒有提供main()函數(shù)的定義,那么這個C文件中不會有main()函數(shù)。此時單獨編譯這個C文件的時候,一定要加上-lfl的連接庫參數(shù);若提供了main()函數(shù),就不必要提供這個連接

7、庫參數(shù)了。連接庫libfl提供了一個缺省的main函數(shù)。缺省的main()函數(shù)中只是簡單地調(diào)用yyflex()函數(shù),而自己提供的main()函數(shù)則可以根據(jù)需要加入許多其他的處理代碼。3.1.2 Bisonbison是替代yacc的語法分析程序生成器.yacc是YetAnotherCompilerCompiler的縮寫.bison又是什么吶是一個生成可以分析文本文件結構的程序的程序.用戶不用直接編寫程序而只用確定好如何分析這些文本文件的規(guī)則就可以了.這種文本結構應用的例子舉不勝舉,其中一個就是計算器(calculator).給定一個字符串:1+2*3人可以馬上計算出結果是7。為什么呢?因為結構。

8、我們的大腦知道如何解釋這個字符串。但是,計算機并不知道,Bison就是一個通過將這個字用用如下方法提供給編譯器以幫助計算機理解工具:+/*1從數(shù)的底部開始,遇到數(shù)2和3,它們通過乘法符號連接在一起,于是計算機將2和3進行乘積運算。計算結果暫時存儲起來,然后計算機發(fā)現(xiàn)2*3的結果與數(shù)1通過加法符號連接在一起。將前面的結果再加1就得到了7。在計算過程中,無論多復雜的計算也都能夠分解成樹形結構,計算機只需要從底層開始,一級一級地向上計算,直到計算到最頂層就可以得到正確的答案。下面根據(jù)bison手冊中的說明,給出一個完整的中綴符號計算器”的bison輸入文件語法規(guī)則文件(包括了詞法分析器):calc.

9、y/*Infixnotationcalculator.*/%#defineYYSTYPEdouble#include<math.h>#include<stdio.h>#include<stdio.h>#include<ctype.h>intyylex(void);voidyyerror(charconst*);%/*Bisondeclarations.*/%tokenNUM%left'-''+'%left'*''/'%leftNEG/*negation-unaryminus*/%ri

10、ght'A'/*exponentiation*/%/*Thegrammarfollows.*/input:/*empty*/|inputlineline:;!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%precNEG$=-$2;|exp,A,exp$=pow(

11、$1,$3);|'('exp,),$=$2;%/詞法分析器intyylex(void)(intc;/*Skipwhitespace.*/while(c=getchar()=''|c='t');/*Processnumbers.*/if(c='.'|isdigit(c)ungetc(c,stdin);scanf("%lf",&yylval);returnNUM;/*Returnend-of-input.*/if(c=EOF)return0;/*Returnasinglechar.*/returnc;int

12、main(void)returnyyparse();voidyyerror(charconst*s)fprintf(stderr,"%sn",s);根據(jù)上面的語法規(guī)則文件(包括詞法分析器),用bison生成計算器的代碼:bisoncalc.y會產(chǎn)生calc.tab.c文件,編譯calc.tab.c文件:cc-lm-ocalccalc.tab.c就產(chǎn)生了calc可執(zhí)行文件,運行示例如下:$./calc4+4.5-(34/(8*3+-3)6.880952381-56+2-543 A293.2 工具優(yōu)缺點總結優(yōu)點:功能強大,可以實現(xiàn)大所屬的靜態(tài)分析,而且具有很高的精度。資料齊全。

13、缺點:比較復雜,掌握起來有一些難度。3.3 實例創(chuàng)建一個簡單的掃描器下列例子來自于Flex的手冊。并在Windows+Cygwin+bison+flex+gcc的環(huán)境下編譯運行。編輯Flex語法文件。/*name:example.flex*/intnum_lines=0,num_chars=0;%n+num_lines;+num_chars;.+num_chars;%intmain()yyiex();printf("#oflines=%d,#ofchars=%dn",num_lines,num_chars);return0;生成掃描器的C文件。$flexexample.fl

14、exTheoutputislex.yy.c4 Lemon4.2 簡介度量工具名稱Lemon網(wǎng)址操作方式命令行實現(xiàn)諦言C適用的操作系統(tǒng)Linux可以度量的屬性備注Lemon是一個C或者C+®言的語法分析器生成器。它和“bison”與“yacc”的功能是一樣的,但它不是“bison”或者“yacc”的簡單復制。為了減少編寫代碼的錯誤,它使用了一種不同的語法。Lemon使用了一種更為高級的分析引擎,運行速度比“bison”與“yacc”要更快,并且該引擎是可重入的和線程安全的。更進一步的,Lemo似現(xiàn)了能夠消除資源泄漏的特性,適合于長時間運行的程序例如GUI或者嵌入式控制器中下面是對lem

15、on語法分析生成器的一個簡介。操作的原理lemon的主要目標是把一個特定語言的上下文無關文法(CFG翻譯成C語言實現(xiàn)的該語言的語法分析器。程序有兩個輸入:語法規(guī)范分析器模板文件典型的,程序員只需提供語法規(guī)范即可。Lemon自帶了一個語法分析器模板,這對大多數(shù)的應用足夠了。如果需要的話,用戶可以替換一個新的分析器模板文件。根據(jù)命令彳T參數(shù),Lemo論產(chǎn)生下面文件中的一個到三個:分析器的C語言代碼;一個頭文件,為每個終結符定義了一個整型ID;描述產(chǎn)生的語法分析器的狀態(tài)的信息文件。默認情況下,上面的三個文件都會產(chǎn)生。如果使用了“-m'選項,則不會產(chǎn)生頭文件;如果使用“-q”選項,信息文件則不

16、會產(chǎn)生。語法規(guī)范文件是一個以“.y”為后綴的文件。在文檔的例子中,設定規(guī)范文件的名稱是“gram.y”。典型的使用方式是:>lemongram.y上面的命令會產(chǎn)生"gram.c"、“gram.h"、“gram.out”三個文件。第一個就是語法分析器,第二個就是為所有的終結符定義了數(shù)值的頭文件,最后一個是分析器使用的狀態(tài)自動機的說明。完整的源代碼包含在兩個文件中,lemon.c本身就是產(chǎn)生器本身。一個單獨的文件lempar.c是lemon產(chǎn)生語法分析子程序需要的模板文件。也可獲取lemon的有關文檔。4.3 工具優(yōu)缺點總結同F(xiàn)lex+Bison。4.4 實例5

17、 makeheaders5.2 簡介度量工具名稱makeheaders網(wǎng)址操作方式命令行實現(xiàn)諦言C+適用的操作系統(tǒng)windows可以度量的屬性備注根據(jù).c文件,自動生成包含全局變量和函數(shù)聲明的頭文件。4.2工具優(yōu)缺點總結此工具可以定位到.c文件中的所有函數(shù),因此這部分代碼可以利用,這是此工具的最大利用價值。只有一個源代碼文件,因此比較簡單。下面代碼是針對找到的函數(shù)定義進行處理:staticintProcessMethodDef(Token*pFirst,Token*pLast,intflags)Token*pCode;Token*pClass;char*zDecl;Decl*pDecl;Str

18、ingstr;inttype;/printf("ntestxxxxn");/pCode=pLast;pLast=pLast->pPrev;while(pFirst->zText0='P')intrc=1;switch(pFirst->nText)case 6: rc=strncmp(pFirst->zText,"PUBLIC",6);break;case 7: rc=strncmp(pFirst->zText,"PRIVATE”,7);break;case9:rc=strncmp(pFirst-&g

19、t;zText,"PROTECTED”,9);break;default:break;if(rc)break;pFirst=pFirst->pNext;pClass=FindDeclName(pFirst,pLast);if(pClass=0)fprintf(stderr,"%s:%d:Unabletofindtheclassnameforthismethodn",zFilename,pFirst->nLine);return1;pDecl=FindDecl(pClass->zText,pClass->nText);if(pDecl=0|(

20、pDecl->flags&TY_Class)!=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!=t

21、ype)if(type&PS_Public)StringAppend(&str,"public:n",0);pDecl->extraType=PS_Public;elseif(type&PS_Protected)StringAppend(&str,"protected:n",0);pDecl->extraType=PS_Protected;elseif(type&PS_Private)StringAppend(&str,"private:n",0);pDecl->extraType=PS_Private;StringAppend(&str,"&quo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論