问题描述
keyword LegendOperation = 'or' | 'and';
Syntax LegendData
= legend_data: LegendKey '=' {ID LegendOperation}+ Newlines
;
我需要将其分解为一种允许我保留有关 ID 的分隔符是“或”还是“和”的信息的方式,但我在文档中没有找到有关是否保留分隔符和如果它可以被内爆使用。最初,我做了类似下面的事情来尝试保留该信息。
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
;
哪个有效并允许我们保留分隔符上的信息,但需要后期处理才能变成可用的数据类型。