rascal - 内爆时保留分离器
问题描述
我有一个看起来像这样的语法定义
keyword LegendOperation = 'or' | 'and';
syntax LegendData
= legend_data: LegendKey '=' {ID LegendOperation}+ Newlines
;
我需要将其分解为一种允许我保留有关 ID 的分隔符是“或”还是“和”的信息的方式,但我在文档中没有找到任何关于分隔符是否保留以及是否可以保留的信息被内爆使用。最初,我做了类似下面的事情来尝试保留该信息ACn。
syntax LegendData
= legend_data_or: LegendKey '=' {ID 'or'}+ Newlines
> legend_data_and: LegendKey '=' {ID 'and'}+ Newlines
;
我遇到的问题是它需要能够解析三种形式的文本
. = Background
@ = Crate and Target
# = Crate or Wall
当它尝试解析第一行时,它会遇到歧义错误,而应该将其解析为带有单个元素的legend_data_or(也许我误解了如何使用优先级)。老实说,我更希望能够使用第二种格式,但有没有办法消除歧义?
在保留分隔符的同时内爆第一种语法的方法或消除第二种格式的歧义的方法都可以帮助我解决这个问题。
解决方案
我最终没有想出一个优雅的解决方案。与其他人讨论我们能想到的最好的办法是
syntax LegendOperation
= legend_or: 'or' ID
| legend_and: 'and' ID
;
syntax LegendData
= legend_data: LegendKey '=' ID LegendOperation* Newlines
;
这有效并允许我们保留分隔符上的信息,但需要后处理才能变成可用的数据类型。
推荐阅读
- react-native - 有谁知道如何将 ProfileScreen 图像与抽屉导航图像匹配?反应原生
- swift - Swift 打开地图应用程序显示特定地址引脚(分支)?
- rest - 将 HATEOAS 用于 RPC 样式的命令是否 RESTful
- node.js - 托管在 heroku 上的节点应用程序崩溃错误代码 H10
- google-analytics - 更改域后保留 Google 客户 ID
- rocket-chip - RISCV DCache.scala 状态机和工作流程
- php - Symfony 4 CollectionType 约束 - 字符串数组
- powershell - 使用 PowerShell 授予对“IIS AppPool”文件夹的访问权限
- reactjs - React-Redux 时钟不会更新它在 DOM 中的状态
- python - 如何开始使用线性编程和 Python?