青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 51, 文章 - 1, 評論 - 41, 引用 - 0
數據加載中……

Python寫的簡易代碼統計工具(1)

         用flex寫的一個簡單代碼統計工具》一文中介紹了用flex工具寫得C代碼統計工具,但功能并不完整,統計子目錄不方便。近日在學習python,便有了用python實現代碼統計工具的想法。

         整個程序分成兩個部分:工作部分和界面部分。工作部分就是執行統計工作。界面部分則負責接受分析用戶指令,調用工作部分進行統計和反饋結果。界面部分又分為窗口界面和控制臺界面,這些將在(2)中介紹,本文主要介紹工作部分。

         統計工作只是簡單區分代碼行和注釋行,并不對文件進行詞法分析,因而較為簡單。比如C++代碼中,只是識別“/*”與“*/”之間和“//”后面的是注釋。而不去分析其他字符是否有意義,符合語法規則。

下面是counter.py的代碼:
# -*- coding: cp936 -*-
'''
按照某種語法規則如c,py,統計一個文件或者某個目錄下文件中代碼和注釋的行數
'''
import sys

def LineTypePy(line, info):
    
'''
    根據py的語法規則,分析此行代碼屬性,使代碼還是注釋。
    line:此行數據,info附加信息,在此無意義
    返回值:1代碼,2注釋,3代碼和注釋,0空行
    
'''
    state, size 
= 0, len(line)
    line 
= line + '\n';
    i 
= -1 # 從0開始
    while i < size:
        i 
+= 1
        
if line[i] == '\n':     # 換行符
            break
        
elif line[i] == ' ' or line[i] == '\t'# 空字符
            continue
        
elif line[i] == '#' or line[i] == ';'# 注釋起始符
            state |= 2
        
else:
            state 
|= 1

    
return state
    
def LineTypeC(line, info):
    
'''
    根據C++的語法規則,分析此行代碼屬性,使代碼還是注釋。
    line:此行數據,info附加信息,是否是塊注釋
    返回值:1代碼,2注釋,3代碼和注釋,0空行
    
'''
    state, size 
= 0, len(line)
    line 
= line + '\n' #添加一個字符防止越界
    i = -1
    
while i < size:
        i 
+= 1
        
if line[i] == '\n':      # 換行符
            break
        
elif line[i] == ' ' or line[i] == '\t'# 空字符
            continue
        
elif line[i] == '/' and line[i+1== '/':# 行注釋
            state |= 2
            i 
+= 1
        
elif line[i] == '/' and line[i+1== '*':# 塊注釋開始符
            state |= 2
            info[0] 
= 1
            i 
+= 1
        
elif line[i] == '*' and line[i+1== '/':# 塊注釋結束符
            state |= 2
            info[0] 
= 0
            i 
+= 1
        
else:
            
if info[0] == 0:
                state 
|= 1
            
else:
                state 
|= 2
    
return state

def CounteFile(res, typefunc, filename):
    
'''
    統計文件
    res統計結果,typefunc行屬性判斷函數,filename文件名
    
'''
    ret 
= [0,0,0,0,0]
    info 
= [0]
    
for line in open(filename, 'rt'):
        ret[typefunc(line, info)] 
+= 1
        ret[
4+= 1 # 代碼總行數
    res.append([filename,ret])

def CounteDir(res, typefunc, spath, modes, level):
    
'''
    統計目錄下的文件
    res統計結果,typefunc行屬性判斷函數,spath路徑名
    modes文件后綴名,level統計幾層子目錄,-1為所有子目錄
    
'''
    
import os
    
import os.path
    eles 
= os.listdir(spath)
    dirs, files 
= [], []
    
    
#區分文件和目錄
    for ele in eles:
        ele 
= os.path.join(spath,ele)
        
if os.path.isdir(ele):
            dirs.append(ele)
        
else:
            files.append(ele)
            
    
# 統計文件
    for f in files:
        isokfile 
= True
        
if modes == []:
            
pass
        
else:
            
for m in modes:
                
if f[-len(m):] == m:
                    
break
            
else:
                isokfile 
= False
        
if isokfile:
            CounteFile(res, typefunc, f)

    
# 判斷子目錄是否計算完全
    if level == 0:
        
return

    
# 遞歸計算子目錄
    for d in dirs:
        CounteDir(res, typefunc, d, modes, level
-1)


class CodeCounter:
    
'''
    代碼統計器的類接口
    
'''
    
def __init__(self,codefiles=[],modes='.c,.h,.cpp',typefunc=LineTypeC,
                 codetype
='c',level=1):
        self.level 
= level
        self.modes 
= modes
        self.codefiles 
= codefiles
        self.typefunc 
= typefunc
        self.codetype 
= codetype

    
def Count(self, result):
        
'''
        統計代碼
        result為統計結果
        
'''
        
# 如果統計文件為空,默認統計當前目錄
        if self.codefiles == []:
            self.codefiles.append([
'd''.'])
            
        
for ele in self.codefiles:
            
if ele[0] == 'f':   # 統計文件
                CounteFile(result, self.typefunc, ele[1])
            
elif ele[0] == 'd'# 統計目錄
                CounteDir(result, self.typefunc, ele[1],
                          self.modes.split(
','), self.level)

    
def SetCodeType(self, codetype):
        
'''
        設置統計代碼的類型
        codetype: py表示Python語言,c表示c或c++
        
'''    
        
if codetype == 'py':
            self.typefunc 
= LineTypePy
        
else:
            self.typefunc 
= LineTypeC
        self.codetype 
= codetype

    
def AddCodeFiles(self, t, path):
        
'''
        增加統計文件
        t表示文件類型,f表示文件,d表示目錄
        path表示對應的文件或目錄名字
        
'''
        
if t == 'f':
            self.codefiles.append([
'f', path])
        
elif t == 'd':
            self.codefiles.append([
'd', path])
        
    
def SetLevel(self, level):
        
'''
        設置統計子目錄的層次
        level表示統計幾層子目錄,0表示只統計當前目錄,-1表示所有目錄
        
'''
        self.level 
= level

    
def SetModes(self, modes):
        
'''
        設置統計文件的后綴名
        modes 后綴名列表。例如[.c,.h]
        
'''
        self.modes 
= modes
                
                           
if __name__ == '__main__':
    res 
= []
    counter 
= CodeCounter()
    counter.Count(res)

    stat 
= [0,0,0,0,0]
    
for ele in res:
        
print ele[1][4], ele[1][1]+ele[1][3], ele[1][2]+ele[1][3], ele[1][0], ele[0]
        
for i in range(0, len(stat)):
            stat[i] 
+= ele[1][i]

    
print stat[4], stat[1]+stat[3], stat[2]+stat[3],stat[0],"Total"
這個程序實現了統計文件和目錄的功能。
LineTypePy()函數和LineTypeC()函數分別用py語法和c語法判斷該行字符是注釋還是代碼。
CounteFile()和CounterDir()分別可以統計文件和目錄下文件的代碼注釋。
CodeCounter類則是封裝了CounteFile和CounterDir,提供接口。

待續

posted on 2008-01-11 14:45 lemene 閱讀(1293) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久热re这里精品视频在线6| 欧美精品18+| 久久久精品免费视频| 欧美巨乳在线观看| 久久精品国产清高在天天线 | 亚洲一区二区高清| 午夜综合激情| 国产精品午夜久久| 欧美在线播放一区二区| 亚洲免费影院| 国产一区在线播放| 米奇777在线欧美播放| 久久精精品视频| 免费观看不卡av| 欧美视频一区在线观看| 亚洲福利视频三区| 激情欧美丁香| 欧美一级艳片视频免费观看| 亚洲香蕉伊综合在人在线视看| 欧美女激情福利| 亚洲精品欧美在线| 国产精品成人一区二区三区吃奶| 亚洲一区二区三区精品在线观看| 亚洲影院在线| 极品尤物久久久av免费看| 欧美mv日韩mv国产网站| 一本色道久久88精品综合| 亚洲色诱最新| 亚洲愉拍自拍另类高清精品| 黄色在线一区| 欧美日韩国产综合网 | 久久成人免费网| 亚洲精品视频在线| 女生裸体视频一区二区三区| 亚洲欧美成人在线| 亚洲免费高清视频| 精品69视频一区二区三区| 欧美日韩亚洲国产一区| 女仆av观看一区| 久久久亚洲影院你懂的| 欧美v国产在线一区二区三区| 久久人人九九| 樱花yy私人影院亚洲| 欧美日韩国产高清视频| 亚洲欧美卡通另类91av| 91久久精品国产91性色tv| 亚洲欧美国产精品桃花| 亚洲精品免费在线| 亚洲电影在线看| 欧美日韩色一区| 欧美在线播放高清精品| 亚洲国产成人久久综合| 美女任你摸久久| 久久久国际精品| 欧美一级黄色网| 性欧美激情精品| 一区二区三区免费网站| 亚洲国产成人tv| 欧美日韩一级黄| 亚洲第一主播视频| 国产日韩亚洲欧美综合| 久久在线91| 久久成人资源| 国产亚洲欧洲一区高清在线观看 | 亚洲精品一区二区三区福利| 亚洲精品视频在线| 亚洲精品国产无天堂网2021| 怡红院精品视频在线观看极品| 欧美性视频网站| 欧美一区二区免费视频| 一区二区三区久久精品| 欧美一区二区免费视频| 午夜在线a亚洲v天堂网2018| 欧美一区二区三区啪啪| 欧美一区精品| 美日韩在线观看| 羞羞答答国产精品www一本| 亚洲免费在线观看视频| 亚洲第一狼人社区| 美女露胸一区二区三区| 欧美一区二区三区男人的天堂 | 欧美伦理91| 欧美日韩一区二区在线观看 | 欧美成人免费网站| 欧美男人的天堂| 欧美午夜在线| 国产精品女主播在线观看| 国产一区二区三区直播精品电影 | 91久久国产综合久久蜜月精品 | 国产伦精品一区二区三区照片91 | 久色婷婷小香蕉久久| 六月婷婷一区| 欧美视频第二页| 激情综合在线| 亚洲一区www| 亚洲国产精品高清久久久| 亚洲二区在线观看| 日韩视频在线免费| 在线亚洲伦理| 黄色亚洲精品| 欧美国产视频在线| 欧美日韩精品免费观看| 国产欧美日韩精品一区| 亚洲第一色在线| 亚洲免费在线播放| 欧美福利影院| 午夜视频在线观看一区二区| 欧美日本乱大交xxxxx| 国内外成人免费激情在线视频| 日韩亚洲欧美一区二区三区| 久久躁日日躁aaaaxxxx| 亚洲午夜高清视频| 欧美va亚洲va日韩∨a综合色| 国产亚洲一区精品| 午夜欧美精品久久久久久久| 亚洲人人精品| 欧美成年人视频网站| 永久555www成人免费| 久久精品主播| 午夜亚洲激情| 欧美亚洲不卡| 亚洲综合色噜噜狠狠| 亚洲肉体裸体xxxx137| 久久综合久久久久88| 国产午夜精品视频| 久久精品道一区二区三区| 亚洲一区在线看| 国产精品外国| 亚洲小视频在线观看| av成人老司机| 欧美体内she精视频在线观看| 亚洲精品自在在线观看| 亚洲国产精品第一区二区三区 | 亚洲第一精品夜夜躁人人爽| 性做久久久久久免费观看欧美| 欧美日韩在线播放三区四区| 亚洲精品美女91| 91久久综合| 欧美精品日韩| 在线视频一区二区| 日韩午夜电影av| 国产精品激情电影| 欧美一区二区大片| 午夜在线一区二区| 亚洲电影专区| 亚洲精选中文字幕| 国产精品久久久久久久久| 欧美一区三区二区在线观看| 亚洲欧美日韩精品一区二区| 国产一区二区三区av电影| 美女视频网站黄色亚洲| 欧美.www| 久久成人国产| 欧美成人精品| 夜色激情一区二区| 洋洋av久久久久久久一区| 国产精品视频一二三| 久久精品视频在线观看| 久久天天躁狠狠躁夜夜av| 夜夜狂射影院欧美极品| 亚洲自拍啪啪| 亚洲高清一区二区三区| 亚洲精品久久久久久久久久久| 欧美日韩一二三区| 裸体一区二区三区| 欧美日韩在线播放一区| 久久久另类综合| 欧美久久久久免费| 久久精品国产成人| 欧美日韩成人一区二区| 久久男女视频| 欧美性猛交视频| 欧美黄色一级视频| 国产欧美日韩视频一区二区| 亚洲大片一区二区三区| 国产伦精品一区二区三区在线观看| 亚洲丰满在线| 国产在线精品自拍| 一区二区冒白浆视频| 最新亚洲一区| 久久大逼视频| 亚洲欧美另类在线| 欧美激情视频网站| 久久人人爽国产| 国产精品视频九色porn| 亚洲激情二区| 亚洲电影在线免费观看| 午夜精品福利在线| 亚洲影院在线观看| 欧美三级电影网| 亚洲三级性片| 亚洲精品一区二区三区99| 久久久蜜桃一区二区人| 亚洲欧美伊人| 国产精品视频网站| 亚洲午夜电影网| 一区二区日本视频| 欧美成年网站| 欧美第一黄网免费网站| 伊人狠狠色丁香综合尤物|