首页 > 解决方案 > 内爆时保留分离器

问题描述

我有一个看起来像这样的语法定义

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(也许我误解了如何使用优先级)。老实说,我更希望能够使用第二种格式,但有没有办法消除歧义?

在保留分隔符的同时内爆第一种语法的方法或消除第二种格式的歧义的方法都可以帮助我解决这个问题。

标签: rascal

解决方案


我最终没有想出一个优雅的解决方案。与其他人讨论我们能想到的最好的办法是

syntax LegendOperation
    = legend_or: 'or' ID
    | legend_and: 'and' ID
    ;

syntax LegendData
    = legend_data: LegendKey '=' ID LegendOperation*  Newlines
    ;

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


推荐阅读