ANTLR - 如何使用生成的AST树?

3
我有两个问题:
在我的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))

我想创建一个名为“Message”的Java类,其中包含字段“Agents”,包括A、B和一些内容字段,该字段将保存X、Y。
我已经阅读了《ANTLR明确指南》,但是没有看到如何使用组合的令牌,甚至没有看到如何像我想要的那样导航树的参考。好像每个ANTLR教程都是关于表达式求值器的!
我看过ANTLR在线手册中的“AST与Java接口”和“表达式求值器”,但我不太明白如何将其应用于我的问题。如果您能提供一个简单的例子,那就非常有帮助!
请帮忙...谢谢!
1个回答

1
$msg_content.text 返回了一个空异常。
这个问题很难在没有看到所有相关规则和代码的情况下进行评论。你能否编辑你的问题并包含一个自包含的示例,我或其他人可以运行以重现错误/异常?
(MSG (AGENTS A B) (MSG_CTS x y)) 我想要有一个Java类"Message",它有一个包含A、B的"Agents"字段和一个将X、Y保存的Content字段。
请查看这个教程列表:https://stackoverflow.com/questions/278480/antlr-tutorials,其中不是所有都是关于表达式求值器的。我的教程演示了如何在树遍历器中使用自定义节点类。
另请参见这个问答,它还展示了如何在树遍历器中使用自定义节点类。

我已经阅读了Bart Kiers的教程,但它仍然只是一个表达式求值器。我想知道如何解决我的特定问题。例如,我想创建一个“代理”对象,将其附加到“消息”对象上。然后,向下移动并创建一个“内容”对象,再次将其附加到同一消息等等... 我该怎么做? - Inf.S
@Inf.S,不,它不是一个表达式求值器:它是一个带有forwhileif语句、函数等的小型语言。就像我解释的那样:在树遍历器中,我会准确地展示如何创建自定义节点类,这正是你所需要的。 - Bart Kiers
让我回去重新阅读教程,然后阅读作用域。如果我仍然卡住了,我会在这个问答中回复你。谢谢! - Inf.S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接