第一次"亲密接触" ANTLR
最近项目需要实现一个类似Pig的用于分析海量数据的高级数据流语言,其中涉及语法分析的技术,鄙人非计科出生,没学过编译原理,了解点计算理论,倒腾这个实在没啥经验,只能借助开源项目了。
网上G了下,一般推荐JavaCC和ANTLR,Pig用的是JavaCC,不过已经很久没更新了,我没找到JavaCC对应的C/C++ runtime,项目语言定的是C/C++,只能放弃。
ANTLR在多语言支持上就做得很好,基本主流语言都支持了,不过最新的ANTLR3目前只支持C,不支持Cpp的,有点遗憾,但至少满足基本要求了。
下面这两篇入门不错,推荐:
http://blog.csdn.net/NewMap/archive/2007/08/08/1731260.aspx(用的ANTLR2,有cpp runtime)
http://www.qingfengju.com/article.asp?id=195 (用的ANTLR3,只c runtime)
下面重点讲讲我郁闷了半天的问题,以后碰到这问题的同学就不用再郁闷瞎折腾了。
咳,这还得从我懒说起。。。
ANTLR3提供了一个不错的IDE ANTLRWorks(在Win XP下,ANTLRWorks的界面不给力,时不时的出现界面花屏;当时在公司用的宽屏,回到家在15寸普屏的win和ubuntu上都试了,没出现花屏,是bug?还是配置差异?难道“牛机”的渲染比不上破本?),就一个文件!不用配置任何环境,拿来就用,当然JDK你还是得装个的。真是懒人必备的好东西啊!于是我一开始就使用了它。
没啥概念,就先把官方的例子直接copy/paste到ANTLRWorks里,但是我死活都无法成功的生成解析代码,不管怎么改文法文件,一直是报下面这个错误:
[internal error: Exception Expr__.g:16:49: unexpected char: '\'@org.antlr.grammar.v2.ANTLRLexer.nextToken(ANTLRLexer.java:346): unexpected stream error from parsing Expr__.g] just for web crawler.
网上G了半天,遇到这问题的就2人,一个打不开,一个用火星语,杯具。
G的途中了解到ANTLR不支持中文,才猛的惊醒,我开始习惯性的把临时的文件保存在桌面了,而ANTLR在生成代码时用到了文件路径,于是乎。。。
后面把文法文件保存在不含中文的目录里,问题得以解决。
PS:后面还发现一个BUG,如果你把文法文件保存在某个磁盘的根目录下,也是无法生成解析代码,说找不到文件,其中错误的文件路径是这样的。。。