antlr - 在 C++ 中使用访问者模式访问 antlr4 可选终端
问题描述
我有以下语法
prod: (ID IN)? subrule (COMMA (ID IN)? subrule)*
ID、IN和COMMA是令牌终端,prod规则生成子规则表达式列表。
我正在使用带有访问者模式的 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)*
推荐阅读
- vuejs2 - 无法访问过滤器中的方法 - Vue.js 2.0
- android - Android RecyclerView 避免滚动
- spring-boot - 如何在 Spring Boot 应用程序中添加迎风报告 Java 引擎?
- ios - 如何在IOS中显示和隐藏后台播放器
- phpstorm - Velocity / PhpStorm 实时模板语法
- sql-server - tSQLt - 关于名为“Setup”的存储过程 - 在测试之前自动执行
- java - 防止 MigLayout 组件出现间距
- javascript - 在一个配置文件下的客户端上运行的 javascript 可以在备用配置文件下打开一个新窗口吗?
- angular - 在 Angular 4 中向 DOM 元素添加事件监听器
- c# - asp.net c#中会话变量范围的范围是什么?