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.没有考虑单行注释可以跨行的情况