在 C++ 中使用访问者模式访问 antlr4 可选终端

Accessing antlr4 optional terminals with the visitor pattern in c++

我有如下一段语法

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

IDINCOMMA是令牌终端,prod 规则生成 subrule 表达式的列表。

我正在使用带有访问者模式的 c++ 运行时,现在我遇到了以下问题。

如何找出ID令牌属于哪个子规则?调用 ID() 方法允许我请求特定的第 k 个 ID 令牌,但它不必对应于第 K 个子规则。我想消除歧义。这是一个令牌流示例

subrule COMMA subrule COMMA
 ID IN subrule COMMA

如果我遍历子规则向量,则没有相应的并行 ID 迭代器,并且请求第一个 ID 匹配和上述令牌流中的第一个子规则匹配会给我第一个子规则和第三个子规则的 ID,而不是告诉我第一个子规则没有 ID。

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

谢谢!

为什么不将 (ID IN)? subrule 移动到单独的规则中,比如 subruleDescription

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

一个例子:

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