正在确定要使用的ANTLR版本,或在两者之间进行转换



我想从Apache Hive中获取.g文件,并构建一个解析器(以JavaScript为目标)——最初,这只是验证用户输入Hive查询的一种方式。我使用的文件来自Hive tgz的apache-hive-1.0.0-srcqlsrcjavaorgapachehadoophiveqlparseHiveLexer.gHiveParser.gFromClauseParser.gIdentifiersParser.gSelectClauseParser.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 lexer而不是v3吗?如果是这样的话,也许v3是我应该瞄准的目标,但它不知何故没有达到它?

或者这不是版本控制的问题,而是调用的问题?还是Hive的构建方式提供了所需的额外文件?

根据Hive源代码,他们使用ANTLR 3.4。但在您开始从FromClauseParser.g 中删除最后一个字符串之前

//------------------------------------------------------------------------

相关内容

最新更新