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

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

Python寫的簡易代碼統(tǒng)計(jì)工具(1)

         用flex寫的一個(gè)簡單代碼統(tǒng)計(jì)工具》一文中介紹了用flex工具寫得C代碼統(tǒng)計(jì)工具,但功能并不完整,統(tǒng)計(jì)子目錄不方便。近日在學(xué)習(xí)python,便有了用python實(shí)現(xiàn)代碼統(tǒng)計(jì)工具的想法。

         整個(gè)程序分成兩個(gè)部分:工作部分和界面部分。工作部分就是執(zhí)行統(tǒng)計(jì)工作。界面部分則負(fù)責(zé)接受分析用戶指令,調(diào)用工作部分進(jìn)行統(tǒng)計(jì)和反饋結(jié)果。界面部分又分為窗口界面和控制臺界面,這些將在(2)中介紹,本文主要介紹工作部分。

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

下面是counter.py的代碼:
# -*- coding: cp936 -*-
'''
按照某種語法規(guī)則如c,py,統(tǒng)計(jì)一個(gè)文件或者某個(gè)目錄下文件中代碼和注釋的行數(shù)
'''
import sys

def LineTypePy(line, info):
    
'''
    根據(jù)py的語法規(guī)則,分析此行代碼屬性,使代碼還是注釋。
    line:此行數(shù)據(jù),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):
    
'''
    根據(jù)C++的語法規(guī)則,分析此行代碼屬性,使代碼還是注釋。
    line:此行數(shù)據(jù),info附加信息,是否是塊注釋
    返回值:1代碼,2注釋,3代碼和注釋,0空行
    
'''
    state, size 
= 0, len(line)
    line 
= line + '\n' #添加一個(gè)字符防止越界
    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== '/':# 塊注釋結(jié)束符
            state |= 2
            info[0] 
= 0
            i 
+= 1
        
else:
            
if info[0] == 0:
                state 
|= 1
            
else:
                state 
|= 2
    
return state

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

def CounteDir(res, typefunc, spath, modes, level):
    
'''
    統(tǒng)計(jì)目錄下的文件
    res統(tǒng)計(jì)結(jié)果,typefunc行屬性判斷函數(shù),spath路徑名
    modes文件后綴名,level統(tǒng)計(jì)幾層子目錄,-1為所有子目錄
    
'''
    
import os
    
import os.path
    eles 
= os.listdir(spath)
    dirs, files 
= [], []
    
    
#區(qū)分文件和目錄
    for ele in eles:
        ele 
= os.path.join(spath,ele)
        
if os.path.isdir(ele):
            dirs.append(ele)
        
else:
            files.append(ele)
            
    
# 統(tǒng)計(jì)文件
    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)

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

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


class CodeCounter:
    
'''
    代碼統(tǒng)計(jì)器的類接口
    
'''
    
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):
        
'''
        統(tǒng)計(jì)代碼
        result為統(tǒng)計(jì)結(jié)果
        
'''
        
# 如果統(tǒng)計(jì)文件為空,默認(rèn)統(tǒng)計(jì)當(dāng)前目錄
        if self.codefiles == []:
            self.codefiles.append([
'd''.'])
            
        
for ele in self.codefiles:
            
if ele[0] == 'f':   # 統(tǒng)計(jì)文件
                CounteFile(result, self.typefunc, ele[1])
            
elif ele[0] == 'd'# 統(tǒng)計(jì)目錄
                CounteDir(result, self.typefunc, ele[1],
                          self.modes.split(
','), self.level)

    
def SetCodeType(self, codetype):
        
'''
        設(shè)置統(tǒng)計(jì)代碼的類型
        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ǒng)計(jì)文件
        t表示文件類型,f表示文件,d表示目錄
        path表示對應(yīng)的文件或目錄名字
        
'''
        
if t == 'f':
            self.codefiles.append([
'f', path])
        
elif t == 'd':
            self.codefiles.append([
'd', path])
        
    
def SetLevel(self, level):
        
'''
        設(shè)置統(tǒng)計(jì)子目錄的層次
        level表示統(tǒng)計(jì)幾層子目錄,0表示只統(tǒng)計(jì)當(dāng)前目錄,-1表示所有目錄
        
'''
        self.level 
= level

    
def SetModes(self, modes):
        
'''
        設(shè)置統(tǒng)計(jì)文件的后綴名
        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"
這個(gè)程序?qū)崿F(xiàn)了統(tǒng)計(jì)文件和目錄的功能。
LineTypePy()函數(shù)和LineTypeC()函數(shù)分別用py語法和c語法判斷該行字符是注釋還是代碼。
CounteFile()和CounterDir()分別可以統(tǒng)計(jì)文件和目錄下文件的代碼注釋。
CodeCounter類則是封裝了CounteFile和CounterDir,提供接口。

待續(xù)

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


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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>
            亚洲午夜激情网页| 亚洲一区二区三区在线看| 嫩草伊人久久精品少妇av杨幂| 毛片基地黄久久久久久天堂| 亚洲娇小video精品| 欧美日本国产精品| 亚洲欧美日韩在线综合| 美玉足脚交一区二区三区图片| 亚洲国产成人久久综合| 欧美视频二区| 欧美一区高清| 亚洲欧洲精品一区二区| 亚洲一区二区三区免费在线观看| 国产日韩精品一区二区浪潮av| 久久频这里精品99香蕉| 99v久久综合狠狠综合久久| 欧美一区二区日韩一区二区| 亚洲国产精品福利| 国产精品久久久免费| 久久久久久久一区二区| 日韩一区二区免费高清| 老司机一区二区三区| 亚洲午夜av电影| 在线播放一区| 国产精品欧美日韩| 免费一区二区三区| 午夜精品久久久久久久白皮肤| 欧美韩日一区二区| 性欧美video另类hd性玩具| 亚洲国产欧美不卡在线观看| 国产精品美女在线| 欧美精品一区二| 久久精品国产亚洲一区二区| 一区二区精品在线观看| 欧美国产成人精品| 久久精品欧美| 亚洲在线视频网站| 亚洲精品国产精品国产自| 国产亚洲一级| 国产精品国产自产拍高清av| 欧美二区视频| 久久久999精品视频| 亚洲男人第一网站| 亚洲另类春色国产| 欧美激情在线播放| 老牛嫩草一区二区三区日本| 欧美一区二区日韩| 亚洲欧美精品在线观看| 日韩视频一区二区三区在线播放免费观看 | 日韩视频第一页| 欧美成年人在线观看| 久久精品中文| 欧美在线你懂的| 香港久久久电影| 亚洲欧美成人一区二区在线电影 | 在线国产日韩| 激情久久综艺| 国内在线观看一区二区三区| 国产日韩欧美在线播放不卡| 国产精品免费一区二区三区观看| 欧美日韩在线一二三| 欧美日韩国产成人在线观看| 欧美电影免费观看高清完整版| 美日韩在线观看| 美女网站久久| 欧美成人精品不卡视频在线观看| 久久人人爽人人爽| 美女诱惑一区| 欧美国产一区二区在线观看| 欧美精品一区二区三区蜜桃| 欧美精品一区二区精品网| 欧美精品一区二区视频| 欧美精品在线极品| 欧美色大人视频| 国产精品一区免费观看| 国产日韩欧美夫妻视频在线观看| 国产一区成人| 在线观看一区二区视频| 亚洲黄色天堂| 在线视频精品一区| 亚洲综合另类| 久久久国产精品一区二区中文 | 亚洲影院在线观看| 欧美一区免费视频| 久久综合九九| 欧美日韩精品久久| 国产精品视频久久| 一区福利视频| 亚洲精品中文字幕在线| 亚洲视频在线观看免费| 欧美亚洲在线播放| 免费看亚洲片| 亚洲三级影片| 亚洲欧美日韩天堂一区二区| 久久久www成人免费精品| 欧美成人激情视频| 国产精品igao视频网网址不卡日韩| 国产乱码精品一区二区三| 精品1区2区3区4区| 一本色道久久综合亚洲精品婷婷| 亚洲欧美另类中文字幕| 久色婷婷小香蕉久久| 亚洲片在线观看| 销魂美女一区二区三区视频在线| 久久亚洲一区二区| 欧美视频网址| 在线观看中文字幕亚洲| 亚洲在线成人精品| 欧美www在线| 亚洲影院色无极综合| 蜜臀久久99精品久久久久久9 | 欧美在线一级视频| 欧美韩日一区二区三区| 国产欧美精品日韩| 99re视频这里只有精品| 久久国产福利国产秒拍| 亚洲精品小视频在线观看| 性久久久久久久久久久久| 欧美精品免费视频| 黄色日韩网站| 午夜精品区一区二区三| 欧美韩国日本综合| 欧美在线观看一区| 欧美三级中文字幕在线观看| 亚洲国产精品电影| 久久精品一区二区三区不卡牛牛| 亚洲精品视频在线观看网站 | 国产精品制服诱惑| 一本色道久久加勒比88综合| 免费日韩精品中文字幕视频在线| 亚洲一区3d动漫同人无遮挡| 欧美黄在线观看| 一色屋精品视频免费看| 欧美一区在线看| 99在线精品视频| 欧美激情一二三区| 亚洲国产精品毛片| 久久欧美中文字幕| 午夜电影亚洲| 国产精品视频一区二区高潮| 亚洲色图在线视频| 91久久在线播放| 美日韩丰满少妇在线观看| 国内精品美女在线观看| 欧美在线观看视频在线| 亚洲午夜精品一区二区| 欧美日韩在线电影| 一区二区三区视频在线播放| 亚洲国产精品久久91精品| 久久亚洲国产精品日日av夜夜| 国产一区91| 久久婷婷国产综合国色天香| 午夜精品美女久久久久av福利| 国产精品久久久久久久久久久久| 亚洲天堂av电影| a4yy欧美一区二区三区| 欧美日韩一区三区四区| 亚洲深夜影院| 一区二区三区四区蜜桃| 国产精品久久久久久久7电影| 亚洲图片在区色| 在线视频你懂得一区| 国产精品久久久久三级| 午夜亚洲精品| 欧美一级在线视频| 韩国欧美一区| 欧美福利视频| 欧美日本视频在线| 亚洲一区视频在线| 亚洲综合色丁香婷婷六月图片| 国产精品高潮粉嫩av| 欧美与黑人午夜性猛交久久久| 欧美亚洲日本网站| 一区二区三区中文在线观看| 女仆av观看一区| 欧美精品www| 亚洲在线网站| 欧美中文字幕在线观看| 国产手机视频精品| 欧美www在线| 欧美日韩成人精品| 性久久久久久久久久久久| 欧美自拍偷拍午夜视频| 亚洲激情校园春色| 在线视频日韩精品| 国产亚洲精品自拍| 亚洲高清久久久| 国产精品盗摄久久久| 久久久久高清| 欧美极品影院| 欧美一级视频精品观看| 久久嫩草精品久久久精品| 妖精成人www高清在线观看| 亚洲综合国产| 亚洲高清成人| 亚洲图片在线观看| 在线日韩中文字幕| 国产精品99久久久久久久vr| 国产一区二三区| 亚洲精品国产日韩|