批量去掉 C++/C 中的注释

经常打开以前写的代码要作为作业提交的时候发现要么中文注释变成乱码了,要么之前的注释过于详细导致影响正常阅读了。。。。

总之就是想删去注释清爽一下的时候。。。百行以内的手工操作还好说,再长一些的就很累人了,而且程序解决一定又快有好。

 

由于这个问题显然是文件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解释器玩腻了的时候可以将关键词换成中文的,当然就是玩玩了,没有任何意义。。。

效果就是下面这样子。。。果然太无聊了,为了输入方便还刻意将英文的()换成()。。。

http://user.qzone.qq.com/414445050/blog/1416846214

posted @ 2014-12-03 13:32  羽加迪姆勒维奥萨  阅读(3245)  评论(1编辑  收藏  举报