ANTLR的一些错误解决方案

antlr书写和编译的典型错误:

[b]错误1:[/b]
2013-04-27 16:34:53,116 ERROR ql.Driver (SessionState.java:printError(401)) - FAILED: RewriteEmptyStreamException token valueList
org.antlr.runtime.tree.RewriteEmptyStreamException: token valueList
at org.antlr.runtime.tree.RewriteRuleElementStream._next(RewriteRuleElementStream.java:158)
at org.antlr.runtime.tree.RewriteRuleTokenStream.next(RewriteRuleTokenStream.java:57)
at org.apache.hadoop.hive.ql.parse.HiveParser.partitionValuesExper(HiveParser.java:17876)
at org.apache.hadoop.hive.ql.parse.HiveParser.partitionExper(HiveParser.java:17569)
at org.apache.hadoop.hive.ql.parse.HiveParser.partitionTemplate(HiveParser.java:17306)
at org.apache.hadoop.hive.ql.parse.HiveParser.tablePartition(HiveParser.java:16794)
at org.apache.hadoop.hive.ql.parse.HiveParser.createTableStatement(HiveParser.java:3783)
at org.apache.hadoop.hive.ql.parse.HiveParser.ddlStatement(HiveParser.java:1836)
at org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:959)
at org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:644)
at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:439)
at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:416)
at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:335)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:893)
at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:259)
at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:216)
at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:412)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:755)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:613)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.hadoop.util.RunJar.main(RunJar.java:156)


解决方法:
本问题产生原因是赋值定义不对,产生错误的代码定义:
partitionValuesExper
@init { msgs.push(" partitionValuesExper specification"); }
@after { msgs.pop(); }
:KW_VALUES KW_LESS KW_THEN LPAREN value=stringOrNumOrFunc RPAREN
-> ^(TOK_VALUES_LESS $value )
|KW_VALUES KW_GREATER KW_THEN LPAREN value=stringOrNumOrFunc RPAREN
-> ^(TOK_VALUES_GREATER $value )
| KW_VALUES LPAREN valueList=(stringOrNumOrFuncList)
RPAREN
-> ^(TOK_VALUES $valueList )


错误出现在
[color=red]KW_VALUES LPAREN valueList=(stringOrNumOrFuncList) RPAREN[/color]
去掉括号,改为:
[color=blue]valueList=stringOrNumOrFuncList[/color]

[b]错误2:[/b]
”reference to rewrite element tableSubPartition without reference on left of ->“
通常这个错误的伴随Decision can match input such as "..." using multiple alternatives错误出现

解决方法:
错误的原因是不服和LL文法定义,特别是歧义的片段定义副本有如identity等变量定义,让状态机产生歧义,解决方法是将相同的部分提取出来,分层定义即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值