确定要使用的ANTLR版本,还是在之间进行转换?

时间:2015-02-18 21:03:33

标签: parsing antlr

我想从Apache Hive获取.g文件并构建解析器(以JavaScript为目标) - 最初,这只是一种验证用户输入Hive查询的方法。我正在使用的文件来自Hive tgz的apache-hive-1.0.0-src\ql\src\java\org\apache\hadoop\hive\ql\parseHiveLexer.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词法分析器而不是v3吗?如果是这样,也许v3是我应该瞄准的,但是它不知何故没有击中它?

或者这不是版本控制的问题,而是调用问题?或者Hive是否以提供所需的其他文件的方式构建?

1 个答案:

答案 0 :(得分:0)

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

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