hive中antlr语法文件的编译

最近项目需要想用到hive中antlr的sql语法解析做二次开发,之前看hive源码的时候编译过,也遇到不少问题,现在居然忘了,看来好记性不如烂笔头,差记性就更加得多写写了。

编译是在windows xp环境下进行的,下载所需要的文件如下:



    antlr-2.7.7.jar

    antlr-3.0.1.jar

    stringtemplate-3.1b1.jar

    Hive.g



文件放在目录C:\hive\BAK目录下,DOS命令行进入到目录,输入:
Java代码 复制代码 收藏代码
  1. C:\hive\BAK>java -cp antlr-2.7.7.jar;antlr-3.0.1.jar;stringtemplate-3.1b1.jar or 
  2. g.antlr.Tool Hive.g 

会输出:
Java代码 复制代码 收藏代码
  1. ANTLR Parser Generator  Version 3.0.1 (August 13, 20071989-2007 
  2. warning(200): Hive.g:1461:5: Decision can match input such as "Identifier DOT Id 
  3. entifier" using multiple alternatives: 1, 2 
  4. As a result, alternative(s) 2 were disabled for that input 

再看目录下会增加几个文件
HiveParser.java
Hive.tokens
Hive__.g
HiveLexer.java

  HiveLexer.java和 HiveParser.java分别是生成的对应词法和语法分析类文件
  Hive__.g对应HiveLexer.java的词法分析规范
  Hive.tokens定义了词法分析后的所有token

需要说明的是antlr-3.0.1.jar是在antlr-2.7.7.jar的基础上进行的开发,有依赖关系。

编译中遇到的错误:
1、有帖子说编译格式为:
Java代码 复制代码 收藏代码
  1. C:\hive\BAK>java antlr.Tool Hive.g 
  2. ANTLR Parser Generator   Version 2.7.7 (20060906)   1989-2005 
  3. Hive.g:17:1: unexpected token: grammar 
  4. error: Token stream error reading grammar(s): 
  5. Hive.g:247:1: unexpected char: '@' 
  6. Hive.g:17:1: rule classDef trapped: 
  7. Hive.g:17:1: unexpected token: grammar 
  8. error: aborting grammar 'unknown grammar' due to errors 
  9. TokenStreamException: unexpected char: '@' 

原因是没有找到对应版本的jar包,应该运行是antlr-3.0.1.jar,而且antlr-3.0.1.jar对应Tool的目录是 org.antlr.Tool

2、编译时没有加classpath
Java代码 复制代码 收藏代码
  1. C:\hive\BAK>java org.antlr.Tool Hive.g 
  2. Exception in thread "main" java.lang.NoClassDefFoundError: org/antlr/Tool 


3、NoClassDefFoundError错误
Java代码 复制代码 收藏代码
  1. Exception in thread "main" java.lang.NoClassDefFoundError: org/antlr/stringtempl 
  2. ate/StringTemplateErrorListener 
  3.         at org.antlr.Tool.main(Tool.java:67

是因为用到的stringtemplate-3.1b1.jar包没有导入到classpath中

总的来说antlr和flex+yacc比较像,使用起来还算比较方便,细心点就行~

你可能感兴趣的:(hive)