如何内爆替代符号的嵌入式选择?

How to implode an embedded choice of alternative symbols?

我有这个语法定义

syntax RuleData
= rule_data: ID+ RulePart '-\>' (Command|RulePart)+ Message? Newlines
;

这在大多数情况下不会给我带来问题,唯一的问题是我不确定如何内爆 (Command|RulePart)+,我查看了 Rascal 文档但没有找到关于如何定义“联合”类型的任何内容。

这是我的 ADT 目前的样子

data RULEDATA
= rule_data(list[str] prefix, list[RULEPART] left, list[???] right, list[str] message, str)
;

那个???是它可以是 RulePart(为了简单起见,它是一个列表[str])或命令(它是一个 str)的位。

原来我把整个事情复杂化了。我没有尝试拥有类型的联合,而是简单地向 RULEPART 添加了一个可以容纳 COMMAND 的附加结构。我想我最初可能也对一些问题感到困惑,因为我在代码的其他部分有错误,我被误解为是由这个问题引起的。

data RULEDATA
    = rule_data(list[str] prefix, list[RULEPART] left, list[RULEPART] right, list[str] message, str)
    ;

data RULEPART
    = part(list[RULECONTENT] contents)
    | command(str command)
    ;