【问题标题】:Can extended Backus Naur Form (EBNF) describe an unordered set of values?扩展的巴科斯瑙尔形式(EBNF)可以描述一组无序的值吗?
【发布时间】:2014-06-04 06:03:02
【问题描述】:

我想使用扩展巴科斯-瑙尔形式 (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
...

【问题讨论】:

  • 您可以通过为集合的每个可能状态定义多个非终结产生式来定义集合,但这意味着 n! (或更糟糕的)作品:)

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


【解决方案1】:

可以在 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
      ? ;

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

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

【讨论】:

  • 感谢@rici,关于设置无重复元素要求的好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多