程式碼統計工具cloc
cloc是一個基於perl的、十分好用的程式碼統計工具(http://cloc.sourceforge.net/),它所支援的語言還算十分豐富。不過,還是有很多用的較少的語言是不支援的。
專案中的一些功能模組用到re2c來實現字元匹配,因此,這些.re檔案是cloc無法統計的。
不過還好,cloc提供了使用者定製功能,使得我們還是可以實現對.re檔案進行程式碼行統計。
定製方法很簡單,基本有步驟如下:
1. 匯出預設支援語言型別相關配置到一個檔案中,命令:
cloc.pl --write-lang-def=langs.txt
2. 參考其他語言的格式,修改langs.txt,新增所要統計語言原始碼檔案的字尾名(這裡參考了C語言):
re2c filter remove_matches ^\s*// filter call_regexp_common C filter remove_inline //.*$ extension re
3. 使用新定義的語言檔案langs.txt執行cloc:
cloc.pl --read-lang-def=langs.txt [原始檔|目錄]
但是還是有問題,用過re2c的人都知道,re2c是以/*!re2c [程式碼] */的形式將程式碼嵌在C程式碼中,這與C語言的註釋相沖突,因此,上面操作後,cloc依然區分不開re2c內嵌程式碼和註釋,因此,會把這部分程式碼識別為註釋,而與實際不符。
對於這個問題,我一開始也是在嘗試通過修改langs.txt檔案的方法來進行支援,很遺憾,一直到現在沒能找到。所以,我參考cloc.pl中python對於docstring的處理方式以及處理函式docstrings_to_C,也在cloc.pl中添加了一個新函式re_to_C,將/*!re2c [程式碼]*/的形式改成!re2c[程式碼]!re2c,這樣就與C語言的註釋語句格式區分開了,再修改langs.txt檔案,讓cloc.pl在統計前,先進行re_to_C處理,再按C語言的方式進行處理,最終,實現了對re2c檔案的正確統計(呵呵,至少目前來看是正確的)。
最終langs.txt中re2c的內容如下:
re2c filter re_to_C filter remove_matches ^\s*// filter call_regexp_common C filter remove_inline //.*$ extension re
新增的re_to_C程式碼如下(呵呵,沒學習perl,完全是照貓畫虎呀):
sub re_to_C { # {{{1 my ($ra_lines, ) = @_; # Converts Python docstrings to C comments. print "-> re_to_C()\n" if $opt_v > 2; my $in_re = 0; foreach (@{$ra_lines}) { if (!$in_re) { while (/\/\*!re2c/) { s{\/\*!re2c}{!re2c}; $in_re = 1; } } else { while (/\*\//) { s{\*\/}{!re2c}; $in_re = 0; } } } print "<- re_to_C\n" if $opt_v > 2; return @{$ra_lines}; } # 1}}}
其他的語言應該也可以通過類似的方法定製吧。