延伸的Backus Naur形式(EBNF)可以描述一组无序的值吗?

时间:2014-06-04 06:03:03

标签: parsing context-free-grammar ebnf context-free-language

我想使用Extended Backus-Naur Form(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
...

1 个答案:

答案 0 :(得分:4)

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

The standard - 在某种程度上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
      ? ;

对于构建解析器生成器没有太大用处,但对于理解与您相同语言的人类读者可能会有所帮助。

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