如何在语法定义中定义替代文字?

How can you define alternative literals in a syntax definition?

我正在尝试定义一种语法来解析 COBOL 中的数据定义,并且对图片子句有一个特定的定义,如下所示:

syntax PictureClause =  pic: "PIC" PictureStringType  PictureStringLen ("VALUE"|"VALUES") ValueSpec

我为此语法匹配的 ADT 是这样的:

data PictureClause = pic(str pictype, PictureStringLen plen, str valuespec);

但是,我注意到 implode 函数似乎试图将带括号的语句与第二个 str 参数匹配,而不是像 "PIC" 字符串文字那样忽略它。但是,此语法定义按预期工作:

syntax PictureClause =  pic: "PIC" PictureStringType  PictureStringLen "VALUE" ValueSpec
                   |pic: "PIC" PictureStringType PictureStringLen "VALUES" ValueSpec;

如标​​题所述,如何在单个语句中为语法定义中的 ADT 中不需要的文字定义替代项?我可以看到替代方案是可能的,但我想知道是否有更简洁的方式来定义它,本着我第一次尝试的精神

我似乎记得 implode 的当前版本将备选方案视为节点并且不会展平它们,即使备选方案只是文字。尽管如此,你的定义是完美的。

恕我直言,这是一个相对简单的功能请求,如果您有时间在 GitHub 上注册它。

另一种选择是完全不内爆并使用具体语法