第一次"亲密接触" 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,如果你把文法文件保存在某个磁盘的根目录下,也是无法生成解析代码,说找不到文件,其中错误的文件路径是这样的。。。

  

posted @ 2011-01-07 18:28  spork  阅读(3246)  评论(1编辑  收藏  举报