每个程序员能够拥有的工具, 足以感动的我们痛哭流涕.
最近我接手一个 Windows 下的 GUI 客户端软件, 下面把
最近使用工具的三个场景记录一下.
1.
拿到遗留代码之后, 加入 git 版本控制, 第一件事就是
把格式规整规整. 给人看的代码怎么能没有一个统一的
风格? astyle (1) 上.
$ for f in `find -name "*.cpp" -o -name "*.h" -o \
-name "*.c" -o -name "*.cc" -o -name "*.cxx"`; do \
echo "$f"; astyle --mode=c --pad=oper \
--unpad=paren --convert-tabs --style=ansi < "$f" > \
"$f".bak && mv "$f".bak "$f"; done (2)
2.
发现有一些代码文件已经彻底过时了, 项目已经不再需要
它们了, 但是它们还在源代码文件夹下, 需要把它们清理
掉. 首先我们需要知道哪些文件已经不再需要了.
$ mkfifo /tmp/fifo1
$ cat zs.vcproj | egrep '\.cpp|\.h|\.cxx' | grep -v \
'common' | gawk -F\" '{print $2}' | sort > \
/tmp/fifo1 &
$ mkfifo /tmp/fifo2
$ ls *.cpp *.cxx *.h -1 | sort > /tmp/fifo2 &
$ diff /tmp/fifo1 /tmp/fifo2
3.
将项目构建为 Unicode 时需要将大量字符串常量由
"This is a string" 的形式改为 _T("This is a
string") 的形式. 人力来完成这个工作显然是不现实的,
因为当我完成修改之后:
$ git diff HEAD^ | egrep '^\+' | wc -l
978
但是, 大家都感叹是如此强大的 Visual Studio 2005 并
没有这么一个重构的功能(也或许是我不知道, 对不起,
我是新手). 显然这个问题也超出了正则表达式的能力,
于是祭起 antlr (3), 顺带说一句, antlrworks (4) 帅
呆了.
当然, 我们这个问题很小意思, 用不着自己来写一个全功
能的编译器, 完全可以 fuzzy parsing (5), 也就是我们
只 parse 我们关心的部分, 其他部分动也别动, 下面把
语法文件贴一贴.
lexer grammar SL;
options {
backtrack=true;
filter=true;
}
NON_UNICODE_STRING
: STRING_LITERAL {System.out.print("_T(" + getText() + ")");}
;
UNICODE_STRING
: '_T(' STRING_LITERAL ')' {System.out.print(getText());}
;
fragment
STRING_LITERAL
: '"' ( EscapeSequence | ~('\\'|'"') )* '"'
;
fragment
EscapeSequence
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
| OctalEscape
;
fragment
OctalEscape
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
| '\\' ('0'..'7') ('0'..'7')
| '\\' ('0'..'7')
;
COMMENT
: '/*' ( options {greedy=false;} : . )* '*/'
{System.out.print(getText());}
;
LINE_COMMENT
: '//' ~('\n'|'\r')* '\r'? '\n' {System.out.print(getText());}
;
LINE_COMMAND
: '#' ~('\n'|'\r')* '\r'? '\n' {System.out.print(getText());}
;
EVERYTHING_ELSE
: c=. {System.out.print((char)c);}
;
(1) http://astyle.sf.net
(2) 这是在 cygwin 的 shell 底下, 其实 astyle 也是
在 cygwin 的官方软件里的
(3) http://www.antlr.org/
(4) http://www.antlr.org/works/index.html
(5) http://www.antlr.org/wiki/pages/viewpage.action?pageId=1752
没有评论:
发表评论
没事儿就省省吧, 有事儿请给我发邮件.