如何在ANTLR中进行更复杂的树转换?

如何在ANTLR中进行更复杂的树转换?,antlr,Antlr,我知道我想要制作的AST(我想),它是: ^( STATEMENT alias ( FOREACH rel ( FOREACH_PLAN_SIMPLE ( GENERATE STAR ) ) ) ) 因此,我添加了以下规则: realias_statement : alias EQUAL rel SEMI_COLON -> ^( STATEMENT alias ( FOREACH rel ( FOREACH_PLAN_SIMPLE ( GENERATE

我知道我想要制作的AST(我想),它是:

 ^( 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(75@[])
 [java] error(100): src//org/apache/pig/parser/QueryParser.g:174:95: syntax error: antlr: NoViableAltException(69@[])
 [java] error(100): src//org/apache/pig/parser/QueryParser.g:174:97: syntax error: antlr: NoViableAltException(69@[])
 [java] error(100): src//org/apache/pig/parser/QueryParser.g:174:99: syntax error: antlr: NoViableAltException(69@[])
 [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)
当然,我会继续深入研究这些错误的含义,但我想知道,更一般地说,这类事情是否可以做到?(我确切地知道我想要它的样子,但不知道如何使它看起来像那样。)


谢谢

假设
语句
FOREACH
FOREACH(计划)简单
生成星号
令牌{…}
部分中定义,这应该可以工作:

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

请注意左括号前的
^

这不是有效的重写规则。什么是FOREACH,FOREACH\u PLAN\u SIMPLE,GENERATE和STAR?@Adam12,它们可能是虚构的代币。见: