【问题标题】:What is the difference between EBNF and CFGEBNF和CFG有什么区别
【发布时间】:2025-12-03 17:40:02
【问题描述】:

我知道EBNF可以用来表达Context Free Grammar,但是这两者有什么区别吗?

我之所以问,是因为有些问题要求将 EBNF 转换为 CFG,但就我目前的理解而言,它们看起来是一样的。那么,这种转换背后的意图是什么?

【问题讨论】:

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


    【解决方案1】:

    EBNF 可用于编写上下文无关文法。

    拉丁字母可以用来写英文。

    帕斯卡可以用来表达算法。

    “上下文无关语法”是一种抽象的东西,你可以用 EBNF 形式写出来供机器输入。实际的上下文无关文法是一个数学对象。它有标准符号,但标准符号确实是供人类使用的。

    【讨论】:

      【解决方案2】:

      总结:EBNF不直接等同于CFG形式,但是很多EBNF语法可以机械转换。


      上下文无关文法是一个四元组:

      • 一组非终结符V

      • 一组与V不相交的终端Σ

      • 一组产生式

          v → ω

      其中vV 的一个元素,ω(V ⋃ Σ)<sup>*</sup> 的一个元素(即,可能为空的终端和非终端字符串。

      • 一个起始符号S,它是V的一个元素。

      (参见Wikipedia article 及其参考文献。还有另一种等效形式,它使用一组非终结符V 和一个字母表A,它是VΣ 的联合。)

      为了描述Algol 编程语言,John Backus 在 1959 年提出了 CFG 的早期具体语法;这种形式通常被称为Backus-Naur Form,这是 Donald Knuth 提出的一个名称,以表彰 Algol 报告的合著者 Peter Naur 的贡献。 BNF 和上面的 CFG 形式的主要区别在于,具有共同左侧的产生式使用 | 符号缩写:

           v → ω1 | ω2
          ⇒
            v → ω1
            v → ω2

      但是,在实践中,使用常规运算符,尤其是重复运算符,如 Kleene Star,已被证明更容易编写和理解。 BNF 的许多扩展被提出并用于各种语法,尤其是 Niklaus Wirth。特别是,在标准协议文档中使用一种扩展 BNF 形式变得很普遍,包括 RFC(IETF 互联网标准)和各种 ISO 标准。这些形式最终被“标准化”为Extended BNF, ISO/IEC 14977 和有点相似的Augmented BNF, RFC-5234

      为了将 EBNF 转换为 CFG 形式,有必要将重复的所有用途(包括有限重复)、交替和可选运算符扩展为原始形式,这需要引入新的非终结符。此外,EBNF 和 ABNF 都允许可能无法转换为 CFG 的规范,包括用英语编写的限制。 (请参阅我对Ebnf – Is this an LL(1) grammar? 的回复中的第一个注释)

      【讨论】:

      • “ABNF 允许可能无法转换为 CFG 的规范”。对此我不确定。不区分大小写可以翻译为交替。交替本身和重复的转换很简单。 ISO EBNF 没有提供诸如设置差异之类的警告。你能举个例子吗?
      • @Przemek:任何使用 prose-val 的 ABNF(标准第 12 页顶部)。
      【解决方案3】:

      是的 - 与 ABNF 和 RBNF 不同,EBNF 标准允许例外,这意味着它可用于定义非上下文无关语言。

      证明:

      1. L1 的语言 = {a^n b^n a^m | n, m ≥ 0} 由以下方式生成:

        L1 ::= X,A

        X ::= "a",X,"b" |空字符串

        A ::= A,"a" |空字符串

      2. 第二语言的语言 = {a^n b^m a^m | n, m ≥ 0} 由以下方式生成:

        L2 ::= A,X

      3. L 1 ∩ L 2 = {a^n b^n a^n | n ≥ 0} 不是上下文无关的,因为对于给定的 p ≥ 1,我们可以选择 n > p 使得 s = a^n b^n a^n 在我们的 语言,我们不能选择任何 s 的子串 q 使得 q 的长度为 p,s = xqy 对于某些字符串 x 和 y 和 x q^n y ∈ L 1 ∩ L 2 (因为 q 必须至少包含一个 a 并且应该在左侧和右侧接受相同数量的 as)。

        P ::= L1 - L2

        {a^n b^n a^n | n ≥ 0} 是 Q 的语言,其中

        Q ::= L1 - P

      【讨论】: