删除c++源文件的注释

C++中的注释有两种风格:

1. 单行注释:以 // 开始,换行结束。如果一行的最后一个字符是 / ,那么下一行也是注释

2. 多行注释:以 /* 开始, */ 结束

 

几点特殊:(只在程序中试了一下,不保证完全正确啊)

1. 双引号的注释不起作用

2. 转义字符

3. 没有嵌套注释

 

以下都是合法的注释:

 

测试程序:

 

处理完后应该得到的结果是:

 

 

首先想象一下处理过程,一个字符一个字符的读取输入文件,如果是一般字符,原样输出;如果是特殊字符 /, *, ", /, /n 特殊处理。比如遇到一个 / 字符,则需要看下一个字符是否是 /,如果是就找到了单行注释的开头,接下来找换行符 /n,该行不输出;如果下一个字符是*,则找到了多行注释的开头,接下来需要找匹配的 */;如果是遇到了双引号",则再遇到下一个"之前,要忽略掉这之间的注释。。。

 

这看起来很像状态机的运转过程,实际上在程序编译做词法分析的时候,就是用的类似的过程。

 画一个状态机看看:

state 0: 正在分析,在这个状态下,读到什么,输出什么。

state 1: 读到第一个/ 

state 2: 读到第二个/。//...

state 3: 读到第一二*。/*

state 4: 读到第二个*。/*...*

state 5: 读到第一个双引号"

state 6: 读到转义字符(转义字符后面的双引号不用来配对的)

state 7: 读到//后面的行连接符/。 //....../

state 8: 读到//后面的行连接符/后,继续处理

state 9: 和state0是等价状态,分出这个状态可以做一些操作,比如删除注释。

 

  

这个实现很巧妙也很简洁。

 

用更通用的状态机实现方法。所有的状态都定义成枚举的一个值,每次读入一个字符,根据当前状态和字符,决定要跳转的状态。在while的一开始,根据是PROCESS还是COMMENT状态,做action,实际应该在跳转到PROCESS或者COMMENT状态时,就做相应的action。这个action不能放在第二个switch的case里去,变成如果当前是PROCESS或者COMMENT,action,那样的话已经多了读了一个字符了。

 

 

这两个实现的缺点是只能处理ASCII编码的文件,如果有中文注释就挂了。关于如何处理不同编码文件的问题,容后再议:)

 

 

【参考】

 

http://www.cnblogs.com/yangyangye/articles/1771823.html

P.S.没有考虑单行注释可以跨行的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值