使用c+中的访问者模式访问antlr4可选终端+;

使用c+中的访问者模式访问antlr4可选终端+;,antlr,antlr4,Antlr,Antlr4,我有下面的一段语法 prod:(ID在中)?子规则(逗号(ID中)?子规则)* ID、IN和COMMA是标记终端,prod规则生成一个子规则表达式列表 我用C++运行时使用访问者模式,现在我遇到了以下问题。 如何找出ID令牌属于哪个子规则?调用ID()方法允许我请求特定的第k个ID令牌,但它不必对应于第k个子规则。我想澄清这一点。下面是一个令牌流示例 subrule COMMA subrule COMMA ID IN subrule COMMA 如果我在子规则向量上迭代,没有对应的并行ID迭

我有下面的一段语法

prod:(ID在中)?子规则(逗号(ID中)?子规则)*

IDINCOMMA是标记终端,prod规则生成一个子规则表达式列表

<>我用C++运行时使用访问者模式,现在我遇到了以下问题。 如何找出ID令牌属于哪个子规则?调用ID()方法允许我请求特定的第k个ID令牌,但它不必对应于第k个子规则。我想澄清这一点。下面是一个令牌流示例

subrule COMMA subrule COMMA
 ID IN subrule COMMA
如果我在子规则向量上迭代,没有对应的并行ID迭代器,并且在上面的令牌流中请求第一个ID匹配和第一个子规则匹配将给我第一个子规则和第三个子规则的ID,而不是告诉我第一个子规则没有ID

在children()向量上迭代似乎很有希望,但似乎没有API来区分终端和非终端。有没有办法使用访问者模式来解决这个问题

谢谢

为什么不移动
(ID IN)?子规则
转换为单独的规则,比如说
子规则描述

在这种情况下,您将确定哪个ID对应于哪个子规则,因为在解析树中您将看到一个新节点:
subruleDescriptionContext

例如:

subruleDescription: (ID IN)? subrule
prod: subruleDescription (COMMA subruleDescription)*