ANTRL编译HiveLexer.g文件报错syntax error: antlr: NoViableAltException(@[])

简介: ANTRL编译HiveLexer.g文件报错syntax error: antlr: NoViableAltException(@[])

项目场景:


编程获得数据血缘关系的需求对数据仓库来说并不普遍,只有数据规模达到很大的程度,或者存在复杂数据生产关系的报表数量增加到很大的程度,单独的数据血缘关系工作才有必要。

在规模没达到之前,人工的识别和管理是更经济有效的。


antlr是指可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器。ANTLR—Another Tool for Language Recognition,其前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架。 antlr有 v2 v3 v4多个版本并存,中文文档多数是v2的, hive 1.1.0版本在注释中提到了antlr 3.4。ANTLR将上述结合起来,它允许我们定义识别字符流的词法规则和用于解释Token流的语法分析规则。然后,ANTLR将根据用户提供的语法文件自动生成相应的词法/语法分析器。用户可以利用他们将输入的文本进行编译,并转换成其他形式(如AST—Abstract Syntax Tree,抽象的语法树)。


使用ANTLR3.5.2版本解析Hivesql的源代码grammar文件中的HiveLexer.g,将代码:

@lexer::header {
package org.apache.hadoop.hive.ql.parse
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hive.conf.HiveConf
}
@lexer::members {
  private Configuration hiveConf
  public void setHiveConf(Configuration hiveConf) {
    this.hiveConf = hiveConf
  }
  protected boolean allowQuotedId() {
    if(hiveConf == null){
      return false
    }
    String supportedQIds = HiveConf.getVar(hiveConf, HiveConf.ConfVars.HIVE_QUOTEDID_SUPPORT)
    return !"none".equals(supportedQIds)
  }
}


这段需要注释,以便借用ANTLR编译过后的JAVA不带有该包。


问题描述


将这一段使用/** */注释掉之后,还是编译,发现报错:

[10:58:10] error(100): HiveLexer.g:42:1: syntax error: antlr: NoViableAltException(9@[])
[10:58:10] error(100): HiveLexer.g:42:2: syntax error: antlr: NoViableAltException(49@[])
[10:58:10] error(100): HiveLexer.g:42:7: syntax error: antlr: MissingTokenException(inserted [@-1,0:0='<missing ACTION>',<4>,42:6] at :)
[10:58:10] error(100): HiveLexer.g:42:8: syntax error: antlr: NoViableAltException(22@[])
[10:58:10] error(100): HiveLexer.g:42:9: syntax error: antlr: NoViableAltException(80@[])
[10:58:10] error(100): HiveLexer.g:42:9: syntax error: antlr: NoViableAltException(80@[])
[10:58:10] error(100): HiveLexer.g:47:1: syntax error: antlr: MissingTokenException(inserted [@-1,0:0='<missing SEMI>',<82>,47:0] at KW_TRUE)

原因分析:


查询资料发现


注释中’;'作为终止符,产生错误

 

b0b778330e3c45afa1be55211818c36f.png


踩坑指南:大叔经验分享(78)hive查询报错NoViableAltException - 匠人先生 - 博客园


hive split 分隔分号问题_小亚文的博客-CSDN博客_\073 分隔符


hive 报错NoViableAltException_丶大白菜的博客-CSDN博客_noviablealtexception


解决方案:


把原注释文档全删除或者将其中的;给删掉。

问题解决。

目录
相关文章
|
前端开发 数据库连接 Go
Go 语言错误处理为什么更推荐使用 pkg/errors 三方库?
Go 语言错误处理为什么更推荐使用 pkg/errors 三方库?
130 0
|
7月前
|
IDE 开发工具 Python
python中SyntaxError: unexpected EOF while parsing(语法错误:解析时遇到意外的文件结束)
【5月更文挑战第14天】python中SyntaxError: unexpected EOF while parsing(语法错误:解析时遇到意外的文件结束)
317 6
|
2月前
|
Ubuntu Unix Shell
sh执行脚本报错Syntax error: “(“ unexpected ​的两种解决办法
​sh执行脚本报错Syntax error: “(“ unexpected ​的两种解决办法
|
7月前
|
IDE 搜索推荐 开发工具
|
7月前
|
测试技术 iOS开发 Perl
废弃第三方库导致的library not found for -lXXXXX(linker command failed ) 完美解决方法
废弃第三方库导致的library not found for -lXXXXX(linker command failed ) 完美解决方法
108 0
编译Ffmpeg错误:strsafe.h:1859:11: error: ‘WEOF‘ undeclared
编译Ffmpeg错误:strsafe.h:1859:11: error: ‘WEOF‘ undeclared
106 0
编译pluma: pluma/Makefile.am:192: error: HAVE_INTROSPECTION does not appear in AM_CONDITIONAL
编译pluma: pluma/Makefile.am:192: error: HAVE_INTROSPECTION does not appear in AM_CONDITIONAL
115 0
编译x264出现错误:No working C compiler found.
编译x264出现错误:No working C compiler found.
341 0
|
Linux
编译telepresence:fatal error: libavfilter/avfiltergraph.h: 没有那个文件或目录
编译telepresence:fatal error: libavfilter/avfiltergraph.h: 没有那个文件或目录
84 0
编译OpenJDK12:test_json.cpp error C2143 语法错误
编译OpenJDK12:test_json.cpp error C2143 语法错误
85 0