可能,这是一个重复的问题,但我找不到我想阅读的问题,所以我在这里发帖。
我是Antlr的新手,我尝试使用Antlr4在Scala中制作具有访问者模式的抽象语法树。
但是,我想不出如何将以下多个规则的结果放在一个列表中。
foo: (rule0 | rule1)*
rule0: ...
rule1: ...
我知道有一种方法可以获取每个列表(即rule0
列表和rule1
列表(。 但是,这种方式可能会破坏发生的顺序(我想保持顺序(。 像rules=(rule0 | rule1)*
这样的方式也是不允许的,所以我不能像下面这样写
ctx.rules().asScala.map(...).toArray`
我的问题是如何将多个规则结果放在一起,同时保持访客模式的出现顺序。
访问者只是解析运行生成的解析树上的步行者。访问者类循环访问每个分析器上下文的子级,并调用访问者函数。这意味着实际信息存储在解析树中,您可以直接使用它。
当您获得FooContext
迭代其子列表时,该列表包含找到的Rule0Context
和Rule1Context
实例,这些实例按源代码中的使用顺序排列。这为您提供了有关子部件的位置信息以及有关每个子部件的信息。