2012-01-04 50 views
0

我知道我想要做(我认为)的AST,那就是:如何在ANTLR中进行更复杂的树转换?

^(STATEMENT alias (FOREACH rel (FOREACH_PLAN_SIMPLE (GENERATE STAR)))) 

,所以我增加了以下规则:

realias_statement : alias EQUAL rel SEMI_COLON 
       -> ^(STATEMENT alias (FOREACH rel (FOREACH_PLAN_SIMPLE (GENERATE STAR)))) 
; 

然而,当我尝试编译,我得到下面的错误...

[java] error(100): src//org/apache/pig/parser/QueryParser.g:174:49: syntax error: antlr: MismatchedTokenException(73!=69) 
[java] error(100): src//org/apache/pig/parser/QueryParser.g:174:51: syntax error: antlr: NoViableAltException([email protected][]) 
[java] error(100): src//org/apache/pig/parser/QueryParser.g:174:95: syntax error: antlr: NoViableAltException([email protected][]) 
[java] error(100): src//org/apache/pig/parser/QueryParser.g:174:97: syntax error: antlr: NoViableAltException([email protected][]) 
[java] error(100): src//org/apache/pig/parser/QueryParser.g:174:99: syntax error: antlr: NoViableAltException([email protected][]) 
[java] error(100): src//org/apache/pig/parser/QueryParser.g:0:1: syntax error: assign.types: MismatchedTreeNodeException(0!=18) 
[java] error(10): internal error: src//org/apache/pig/parser/QueryParser.g : java.lang.NullPointerException 
[java] org.antlr.grammar.v3.DefineGrammarItemsWalker.countAltsForRule(DefineGrammarItemsWalker.java:153) 
[java] org.antlr.grammar.v3.DefineGrammarItemsWalker.rule(DefineGrammarItemsWalker.java:1546) 
[java] org.antlr.grammar.v3.DefineGrammarItemsWalker.rules(DefineGrammarItemsWalker.java:1190) 
[java] org.antlr.grammar.v3.DefineGrammarItemsWalker.grammarSpec(DefineGrammarItemsWalker.java:623) 
[java] org.antlr.grammar.v3.DefineGrammarItemsWalker.grammar_(DefineGrammarItemsWalker.java:275) 
[java] org.antlr.tool.Grammar.defineGrammarSymbols(Grammar.java:748) 
[java] org.antlr.tool.CompositeGrammar.defineGrammarSymbols(CompositeGrammar.java:369) 
[java] org.antlr.Tool.process(Tool.java:465) 
[java] org.antlr.Tool.main(Tool.java:93) 

我当然会继续挖成什么这些错误的意思,但我想知道更普遍,如果这样的事情可以做什么? IE我确切地知道我希望它看起来如何,但我不知道如何让它看起来像这样。

感谢

+1

这不是有效的重写规则。什么是FOREACH,FOREACH_PLAN_SIMPLE,GENERATE和STAR? – 2012-01-05 03:14:57

+1

@ Adam12,他们可能是虚构的记号。请参阅:http://www.antlr.org/wiki/display/ANTLR3/Tree+construction – 2012-01-05 14:15:03

回答

2

假设STATEMENTFOREACHFOREACH_PLAN_SIMPLEGENERATE STAR都在tokens { ... }部分定义的,这应该工作:

realias_statement 
: alias EQUAL rel SEMI_COLON 
    -> ^(STATEMENT alias ^(FOREACH rel ^(FOREACH_PLAN_SIMPLE ^(GENERATE STAR)))) 
; 

注意^左括号前。