我想使用扩展的backus-naur形式(ebnf)上下文免费语法来定义无序的值集。它很容易定义EBNF中的无序值列表,例如:

value = 'A' | 'B' | 'C';
list = value, {',', value};
.

但是,我有疑问它可以为无序集完成。

下面是有效的无序值集的示例:

A, B, C, D
A, B, D, C
A, D, C, B
...
D, C, B, A
.

虽然无效列表将是:

A, A, C, D
B, C, C, B
A, A, A, A
...
.

或任意长度列表。

A, A, B, C, D, A
A, B, C, D, A, B, C, D
...
.

有帮助吗?

解决方案

you can 在ebnf中定义无序集,但只能通过列出所有可能的枚举。对于大于两个元素的集合来说是不切实际的。

标准 - 在eBnf的范围内标准化的表示法 - 允许您使用英语(或您觉得舒适的任何其他语言)来描述未其他描述的序列。例如,EBNF的EBNF包括此生产:

syntactic exception
= ? a syntactic-factor that could be replaced 
    by a syntactic-factor containing no
    meta-identifiers
  ? ;
.

同样,您可以写一些如下:

value = 'A' | 'B' | 'C';
list = value, {',', value};
set = ? a "list" where all "value"s are unique ? ;
.

或或许

set = ? a "list" with exactly three values
        where all "value"s are unique
      ? ;
.

对构建解析器发生器并不有多常用,但它可能有助于一个了解与您相同语言的人类读者。

对于真实的解析器生成器,常用策略是允许任何列表,该列表可能包括重复元素,然后在语义分析期间拒绝无效列表。 (甚至更早。这不是一个难度的分析。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top