项目中有一个Bug报出来, 说Log信息中有单词拼错了. 牵连出一个问题: 如何对项目中的注释和字符串(指literal string)做拼写检查. 这个问题看似简单, 真做起来比较麻烦.
1. 方法一, 在vim中:set spell, 用]s, [s查找下一个错误, 用z= 列出正确单词的列表选择.
这个办法对你新写的程序有效. 经实验好用, emacs中当然有对等的办法. 对于既有项目完整地过滤一遍时, 用这个办法会很累
2. 用aspell --mode=ccpp
aspell的单词库貌似很弱, 不能识别单词的复数形式, 和加ed的过去式等词形变化. --ignore-case 选项貌似不生效
3. 用重器1 gcc -save-temps -Wp,-CC 可以生成.i或.ii的预处理后的文件, 但带有注释, -CC 就是为了保留注释的. 这一步之后, 想办法处理.i文件从而把待处理的东西集中起来, 这个文件比原始的.c 文件规矩很多, 因为宏已经被处理了. 这一办法我没有走到底, 原因是, .c会include头文件, 头文件又会递归地include其它头文件, 系统头文件中含有很多注释. 处理头文件很麻烦.
4. 用重器2 gcc -Wa,-ahls=xxx.asm 产生对应的汇编文件, 主要想法跟3一样, 因为编译器已经走过预处理, 编译的步骤, 产生的.asm 比较规范, 容易处理, 每个程序中的字符串会在asm中有一行.string "..." 对应, 用regex容易收集. 但这一步我也没有走下去, 原因是发现在程序中连在一起的一个字符串, 在asm中可能会被分成.ascii 和 .string两个, 用这一招最好把-g关掉, 因为打开的话, gcc会有自己的一些字符串, 如"unsigned long long"
以上3和4两步, 都需要重新编译程序, 如果编译选项写死在一堆Makefile中, 就很难办, 我的办法是在幕后进行替换, 写一个cc和g++的wrapper, 检查它的所有命令行选项, 把自己想要添加的给加上, 想去掉的给去掉, 这一招很灵活, 屡试不爽, 一般人我不告诉他. 后面我把这几个脚本贴出来.
5. 用大杀器 vim 既然可以对代码进行语法高亮, 就可以检查程序中每一个字符对应的是哪个语法元素, 对于字符串, 就是cString, 它内部可能包含cSpecial(如\n\t)和cFormat(即printf中的%lld), 对注释, 就是cComment, cCommentL, cCommentStart, 下面的vim脚本可以自动收集一个程序中的注释, 或是字符串, 保存在另一个新文件中. 缺点是比较慢, 一个文件的处理, 以秒计.
我最终采取的是第5种方法. 收集后的文件, 可以用aspell集中处理, 虽然前面说过它的坏话, 词库弱.
|
文件: | collect_string_comments.zip |
大小: | 1KB |
下载: | 下载 |
|
|
文件: | spell_check.zip |
大小: | 2KB |
下载: | 下载 |
|
阅读(1091) | 评论(4) | 转发(0) |