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

发布于 2024-12-25 02:33:55 字数 2062 浏览 3 评论 0 原文

我知道我想要制作的 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 我确切地知道我想要它的外观,但不知道如何让它看起来像那样。

谢谢

I know the AST I want to make (I think), which is:

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

so I added the following rule:

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

However, when I try to compile this, I get the following errors...

 [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)

I will of course continue to dig into what these errors mean, but I was wondering more general if this sort of thing can be done? IE I know exactly how I want it to look, but am not sure how to get it to look like that.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

调妓 2025-01-01 02:33:55

假设 STATEMENTFOREACHFOREACH_PLAN_SIMPLEGENERATE STARtokens { ... } 中定义 部分,这应该有效:

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

注意左括号之前的 ^

Assuming STATEMENT, FOREACH, FOREACH_PLAN_SIMPLE and GENERATE STAR are defined in the tokens { ... } section, this should work:

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

Note the ^ before the opening parenthesis.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文