2012-07-12 93 views
3

我有2个问题:ANTLR - 如何使用生成的AST树?

在我ANTLR解析器,我有这样的重写规则:

msg: msg_content (COMMA msg_content)* -> ^(MSG_CTS msg_content+); 

在我的树语法,我怎么可以利用收集到的msg_content令牌? $ msg_content.text正在返回空例外。


更一般地说,你能为我提供一些指导,关于我如何使用我生成的AST树?我基本上想要遍历节点并为例如不同的事物创建Java类。

我有这个简单的树会打印:

(MSG (AGENTS A B) (MSG_CTS x y)) 

我想有一些Java类“信息”与“代理商”字段包含A,B,这将持有X的一些内容领域,Y.

我已经通过ANTLR权威指南,但没有参考如何使用组合的标记,甚至,如何浏览树,就像我想要的。就好像每个ANTLR教程都有关于表达式评估者!

我见过:ANTLR在线手册中的“AST与Java的接口”和“表达式评估器”,但我不太清楚如何将这些应用到我的问题中。如果你能提供一个简单的例子,它会非常有帮助!

请帮助...谢谢!

回答

1

$ msg_content.text返回一个空例外

这是不可能的评论没有看到所有相关的规则和代码。你可以编辑你的问题,并包括一个独立的例子,我或其他人,可以运行,再现错误/异常?

(MSG(AGENTS AB)(MSG_CTS XY))

我想有一些Java类 “消息” 与 “代理” 字段含有A,B和将容纳一些内容字段X,Y.

看看这个教程列表:https://stackoverflow.com/questions/278480/antlr-tutorials,并非所有的都是关于表达式评估器。 My tutorial演示如何在树沃克中使用自定义节点类。

另请参阅this Q&A也显示如何在树沃克中使用自定义节点类。

+0

我通读了你的教程Bart Kiers,但它仍然是一个表达式评估器。我想知道如何解决我的特殊问题。例如,我想创建一个“代理”对象,将其附加到“消息”对象。然后,向下移动并创建一个“内容”对象,再次将它附加到同一个消息等...我怎么做到这一点? – 2012-07-12 18:16:15

+0

@ Inf.S,不,它不是一个表达式求值器:它是一个带'for','while'和'if'语句,函数等的小型语言。就像我解释的:在树步行者中,我展示到底如何创建自定义节点类,这是你看起来像是在后面。 – 2012-07-12 18:20:14

+0

让我回头再读一遍教程,然后阅读Scopes。如果我仍然陷入困境,我会在这个问答中回复你。谢谢! – 2012-07-12 19:02:16