1. 程式人生 > >程式碼統計工具cloc

程式碼統計工具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}}}


其他的語言應該也可以通過類似的方法定製吧。