首页 > 解决方案 > 在 C++ 中使用访问者模式访问 antlr4 可选终端

问题描述

我有以下语法

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

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

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

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

subrule COMMA subrule COMMA
 ID IN subrule COMMA

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

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

谢谢!

标签: antlrantlr4

解决方案


为什么不(ID IN)? subrule进入一个单独的规则,比如说subruleDescription

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

一个例子:

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

推荐阅读