Jun 29, 2011

比女人还好玩的 lex & yacc

by Forrest Sheng Bao http://fsbao.net

这世间有很多男人,但是女人总是不这么多

于是剩下的男人玩什么呢? 最近我发现一个好玩的,叫做lex & yacc。这组合是个大杀器,写compiler必备,现在有个升级组合,flex & bison,用起来一样。

我上compiler课的时候居然不知道这个组合,自己硬写了一个lexical analyzer和syntactical analyzer. 现在实在觉得相间恨晚。

先ZB一下,lex是两个人写的,其中一个叫Eric Schmidt,2001-2011 Google的CEO。

所谓lex,就是一个lexical analyzer, 你给他一个string,他告诉你这是啥, 或者做点其他事情

所谓yacc,就是一个syntactical analyzer, 或者叫parser, 你给他一个string,他按照一个context-free gramamr去检查是否复合要求,string里面每一段是语法上的啥东西

比 如,I had fun. 这句话。 lex先告诉我们,I 是代词,had是动词,fun是名词. yacc说代词可以做主语,动词可以做谓语,名词可以做宾语,此句结构是主谓宾,是个英文句子。但是如果你写了i fun had, lex不会报错,但是yacc会说,这句话不是英文吧? 如果你写Ich liebe Linux. lex直接就报错,因为ich和liebe不是英文单词。


当然,其实lex & yacc是无法理解人说的话的,因为人类的语言是ambigious的——于是一个千年大坑natural language processing就挖开了。

虽然如此,我们还有无数按照“规范”的语法设计的东西可以折腾。

比如,我曾经花很多时间写程序去读入某种特别数据格式,比如存储科学数据呈现的VTK XML格式,存储EEG/ECG的EDF+格式,哪怕是一个配置文件。

每种格式我都要写个程序,hard code语法是个没技术含量但是费时的活。这些数据格式都是绝无二义性的语法(当然,你要先写个小接口把二进制数据变成string)。如果早知道lex & yacc,我就可以轻松的把语法定义好, 让他们按照语法把数据和附加信息抽出来。

Anyway, 用lex & yacc你可以干很多事情,比如统计文章里面的英文单词有多少,各种长度的词有多少,一句话里面有几个逗号,然后,你就可以定义你的英文可读性——真的英 文可读性就是按照复杂语法结构的频率定义出来的。Linux和Mac上有个有趣的命令叫做style,可以去看一下。

Conclusion: 搞女人有什么意思,就那么几个玩法。搞技术,是无数的玩法,持久的快感,频繁的高潮。

No comments:

Post a Comment