經常打開以前寫的代碼要作為作業提交的時候發現要么中文注釋變成亂碼了,要么之前的注釋過於詳細導致影響正常閱讀了。。。。
總之就是想刪去注釋清爽一下的時候。。。百行以內的手工操作還好說,再長一些的就很累人了,而且程序解決一定又快有好。
由於這個問題顯然是文件IO+字符串操作,所以用python來做會好一些,主要使用的是re模塊,即使用正則表達式。
1. 將文件逐行讀入並連接成一個字符串(過長的文件應該選擇逐塊進行,但這時候塊注釋需要設定一個標記,否則不知道當前行是塊注釋內部還是外部);
2. 寫兩個識別注釋的pattern然后將匹配到的字符串替換為空串即可。
簡易的版本大概就是這樣,核心就是正則表達式的匹配和替換,十分簡單:
2 import os 3 import re 4
5 hasBlockComment=False 6
7 def parse(string): 8 pattern1=re.compile(r'//.*') 9 result = re.sub(pattern1, "", string) 10
11 pattern2=re.compile(r'(/\*)((\*[^/])*|([^\*])*)(\*/)') 12 result=re.sub(pattern2,"",result) 13
14 return result 15
16
17 def main(): 18 fileName=input("input file path and name:") 19 name,ext=os.path.splitext(fileName) 20 file=open(fileName,"r") 21 result=open("result.txt","w") 22
23 content=""
24 for eachline in file: 25 content+=eachline 26 l=(str)(parse(content)) 27 result.write(l) 28 main()
針對很大的文件,我們需要找到第一個/* 之后記錄它的行數和位置,然后再之后的讀取中遇到 */的時候將之間的內容全部刪除,由於C++ / C 的注釋不能嵌套,所以比如
/* ... /* .... */ 應該是首尾的進行匹配而不是第二個和末尾匹配。
當然自己用的話,注釋應該是不會嵌套的。
用C++ 來做的話也很簡單,不調用一些庫函數的話,可以人工模擬一個簡易的狀態機,逐個進行讀入字符,遇到/*的時候記錄位置,繼續不斷讀入,知道遇到*/ ,標記這個位置,輸出的時候忽略這一段的內容,行注釋的話十分簡單,沒有上下文的干擾,不再贅述了。
之前python 做的scheme解釋器玩膩了的時候可以將關鍵詞換成中文的,當然就是玩玩了,沒有任何意義。。。
效果就是下面這樣子。。。果然太無聊了,為了輸入方便還刻意將英文的()換成()。。。