Parsing 确定要使用的ANTLR版本,或在两者之间转换?

Parsing 确定要使用的ANTLR版本,或在两者之间转换?,parsing,antlr,Parsing,Antlr,我想从中获取.g文件并构建一个解析器(以JavaScript为目标)——最初,这只是验证用户输入配置单元查询的一种方法。我使用的文件来自hive tgz的apache-hive-1.0.0-src\ql\src\java\org\apache\hadoop\hive\ql\parse:HiveLexer.g,HiveParser.g,来自clauseparser.g,IdentifiersParser.g,选择clauseparser.g 我在语法文件中看不到要使用哪个版本的ANTLR,所以我尝

我想从中获取
.g
文件并构建一个解析器(以JavaScript为目标)——最初,这只是验证用户输入配置单元查询的一种方法。我使用的文件来自hive tgz的
apache-hive-1.0.0-src\ql\src\java\org\apache\hadoop\hive\ql\parse
:HiveLexer.g,
HiveParser.g
来自clauseparser.g
IdentifiersParser.g
选择clauseparser.g

我在语法文件中看不到要使用哪个版本的ANTLR,所以我尝试运行ANTLR(从
apt get pcts
)、Antl3和Antl4。它们都会抛出某种类型的错误,因此我不知道应该运行哪个错误,也不知道是否可以(或需要)在不同版本之间转换.g文件

我得到的错误如下:

antlr-Dlanguage=JavaScript HiveParser.g
(看起来它无论如何都不支持JS):

antlr4-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
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中删除最后一个字符串

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

诸如
^
->
(在解析器中)之类的标记表示ANTLR v3..g表示它几乎是v3。对于ANTLRv3,语法可以依赖于目标语言,因此您不能简单地要求ANTLR编译器为您生成JavaScript。移植语法文件需要额外的工作。
//------------------------------------------------------------------------