【问题标题】:Accessing antlr4 optional terminals with the visitor pattern in c++在 C++ 中使用访问者模式访问 antlr4 可选终端
【发布时间】:2019-12-18 00:45:09
【问题描述】:

我有以下语法

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

ID、IN 和 COMMA 是令牌终端,prod 规则生成 subrule 表达式。

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

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

subrule COMMA subrule COMMA
 ID IN subrule COMMA

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

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

谢谢!

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

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

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

    一个例子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多