如何在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 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)
我当然会继续深入研究这些内容错误意味着,但我想知道更一般的情况是否可以完成这种事情? IE 我确切地知道我想要它的外观,但不知道如何让它看起来像那样。
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
假设
STATEMENT
、FOREACH
、FOREACH_PLAN_SIMPLE
和GENERATE STAR
在tokens { ... } 中定义
部分,这应该有效:注意左括号之前的
^
。Assuming
STATEMENT
,FOREACH
,FOREACH_PLAN_SIMPLE
andGENERATE STAR
are defined in thetokens { ... }
section, this should work:Note the
^
before the opening parenthesis.