可以扩展Backus Naur形式(EBNF)描述一个无序的值集?
-
21-12-2019 - |
题
我想使用扩展的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
? ;
.
对构建解析器发生器并不有多常用,但它可能有助于一个了解与您相同语言的人类读者。
对于真实的解析器生成器,常用策略是允许任何列表,该列表可能包括重复元素,然后在语义分析期间拒绝无效列表。 (甚至更早。这不是一个难度的分析。)
不隶属于 StackOverflow