内爆时保留分离器

Retaining separator while imploding

我的语法定义如下所示

keyword LegendOperation = 'or' | 'and';
syntax LegendData
    = legend_data: LegendKey '=' {ID LegendOperation}+ Newlines
    ;

我需要将其分解为一种方式,使我能够保留有关 ID 分隔符是 'or' 还是 'and' 的信息,但我在文档中没有找到任何内容分隔符是否保留,是否可以被内爆使用。最初,我做了类似下面的事情来尝试保留该信息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
    ;

这有效并允许我们保留分隔符上的信息,但需要 post 处理才能变成可用的数据类型。