我想从Apache Hive获取.g
文件并构建解析器(以JavaScript为目标) - 最初,这只是一种验证用户输入Hive查询的方法。我正在使用的文件来自Hive tgz的apache-hive-1.0.0-src\ql\src\java\org\apache\hadoop\hive\ql\parse
:HiveLexer.g
,HiveParser.g
,FromClauseParser.g
,IdentifiersParser.g
,SelectClauseParser.g
。
我在语法文件中看不到要使用哪个版本的ANTLR,所以我尝试运行antlr(来自apt-get pccts
),antlr3和antlr4。他们都抛出某种错误,所以我不知道哪一个运行,或者我是否可以(或需要)在版本之间转换.g文件。
我得到的错误如下:
antlr -Dlanguage=JavaScript HiveParser.g
(看起来它不支持JS):
warning: invalid option: '-Dlanguage=JavaScript'
HiveParser.g, line 17: syntax error at "grammar" missing { QuotedTerm PassAction ! \< \> : }
HiveParser.g, line 17: syntax error at "HiveParser" missing { QuotedTerm PassAction ! \< \> : }
HiveParser.g, line 17: syntax error at ";" missing Eof
HiveParser.g, line 28: lexical error: invalid token (text was ',')
antlr3 -Dlanguage=JavaScript HiveParser.g
:
error(10): internal error: Exception FromClauseParser.g:302:85: unexpected char: '-'@org.antlr.grammar.v2.ANTLRLexer.nextToken(ANTLRLexer.java:347): unexpected stream error from parsing FromClauseParser.g
error(150): grammar file FromClauseParser.g has no rules
error(100): FromClauseParser.g:0:0: syntax error: assign.types: <AST>:299:68: unexpected AST node: ->
error(100): FromClauseParser.g:0:0: syntax error: define: <AST>:299:68: unexpected AST node: ->
error(106): SelectClauseParser.g:151:18: reference to undefined rule: tableAllColumns
antlr4 -Dlanguage=JavaScript HiveParser.g
:
warning(202): HiveParser.g:30:0: tokens {A; B;} syntax is now tokens {A, B} in ANTLR 4
error(50): HiveParser.g:636:34: syntax error: '->' came as a complete surprise to me while looking for rule element
error(50): HiveParser.g:636:37: syntax error: '^' came as a complete surprise to me
error(50): HiveParser.g:638:50: syntax error: '->' came as a complete surprise to me while looking for rule element
error(50): HiveParser.g:638:53: syntax error: '^' came as a complete surprise to me
引用@org.antlr.grammar.v2.ANTLRLexer.nextToken
的antlr3错误似乎令人怀疑。它是使用v2词法分析器而不是v3吗?如果是这样,也许v3是我应该瞄准的,但是它不知何故没有击中它?
或者这不是版本控制的问题,而是调用问题?或者Hive是否以提供所需的其他文件的方式构建?
答案 0 :(得分:0)
根据Hive source code,他们使用ANTLR 3.4。但在开始之前从FromClauseParser.g删除最后一个字符串
//------------------------------------------------------------------------