EBNF和CFG之间有什么区别

时间:2014-02-01 00:36:27

标签: context-free-grammar ebnf

据我所知,EBNF可用于表达Context Free Grammar,但两者之间有什么区别吗?

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

3 个答案:

答案 0 :(得分:3)

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

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

Pascal可用于表达算法。

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

答案 1 :(得分:2)

总结:EBNF并不直接等同于CFG形式主义,但许多EBNF语法可以进行机械转换。


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

  • 一组非终结符V

  • V不相交的一组终端Σ

  • 表格

  • 的一组作品

    v → ω

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

  • 起始符号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?的回答中的第一个注释)

答案 2 :(得分:0)

是-与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. L2的语言= {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,并且应该取与左边和右边相同的数目)。

    P :: = L1 − L2

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

    Q :: = L1 − P