有没有办法将多个规则的零个或多个模式放在 Antlr4 中的一个列表中?

Is there a way to put together zero or more pattern of multiple rules into one list in Antlr4?

可能这是一个重复的问题,但我找不到我想看的问题,所以我在这里发帖。

我是Antlr的新手,我尝试使用Antlr4在Scala中制作带有访问者模式的抽象语法树。

但是,我想不出如何将如下多个规则的结果放在一个列表中。

foo: (rule0 | rule1)*
rule0: ...
rule1: ...

我知道有一种方法可以获取每个列表(即 rule0 列表和 rule1 列表)。 但是,这种方式可能会破坏出现的顺序(我想保持顺序)。 像rules=(rule0 | rule1)*这样的方式也是不允许的,所以我不能像下面这样写

ctx.rules().asScala.map(...).toArray`

我的问题是如何将多个规则结果放在一起,同时保持访问者模式中出现的顺序。

访问者只是在您的解析 运行 生成的解析树上漫步。访问者 class 遍历每个解析器上下文的子项并调用访问者函数。这意味着实际信息存储在解析树中,您可以直接使用它。

当你得到一个 FooContext 迭代它的子列表时,它包含找到的 Rule0ContextRule1Context 实例,按照它们在源代码中的使用顺序。这为您提供了子部件的位置信息以及每个子部件的信息。