代码之家  ›  专栏  ›  技术社区  ›  Jason Baker

bnf vs ebnf vs abnf:选择哪一个?

  •  27
  • Jason Baker  · 技术社区  · 14 年前

    我想提出一种语言语法。我读过一些关于这三个的文章,但我看不出一个人能做什么,另一个人不能做什么。有没有理由用一个来代替另一个?还是只是偏好问题?

    5 回复  |  直到 9 年前
        1
  •  29
  •   Abel    9 年前

    你得考虑一下 EBNF 阿布纳夫 作为扩展,它可以帮助您在开发语法时更加简洁和表达。

    例如,考虑一个可选的非终端符号, 脑钠肽 语法您可以使用中间符号来定义它,例如:

    A        ::= OPTIONAL OTHER
    OPTIONAL ::= opt_part | epsilon
    

    同时 电子束荧光 您可以使用可选语法直接执行此操作:

    A ::= [opt_part] OTHER
    

    既然没有办法在 BNF公司 嵌套选项也必须使用中间符号:

    BNF
    A ::= B C
    B ::= a | b | c
    
    EBNF
    A ::= (a | b | c) C
    

    对于在 EBNF 阿布纳夫 语法,多亏了句法上的糖分,但不符合标准 BNF公司 . ABNF公司 延伸 EBNF ,允许您执行更复杂的操作,例如指定可以在一起找到多少个符号(即 4*DIGIT )

    所以选择一个 阿布纳夫 EBNF 因为您的语法选择的语言将使您的工作更容易,因为您将更具表现力,而不会用语法分析器生成器生成的无用符号填充语法,但您不会关心它们!

        2
  •  5
  •   trololo    9 年前

    根据维基百科,ABNF的双引号字符串文本不区分大小写,并且区分大小写的匹配必须定义为数字ASCII值。我认为这是一个缺点。

    文本是通过使用括在引号中的字符串指定的。( " )这些字符串不区分大小写,使用的字符集是(US-)ASCII。因此,字符串128\226\ 128128 128128128156;abc128128;,\156;\128128\156;ab226\156;abc\128\226\128\\157;,128\157; \156; abc_157;和__abc_157;。对于区分大小写的匹配,必须定义显式字符:要匹配__abc__,定义将为 %d97.66.99 .

    https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_Form#Terminal_values

    然而,RFC7405似乎向ABNF添加了区分大小写的字符串文本。

    https://tools.ietf.org/html/rfc7405

        3
  •  2
  •   Kamarey    14 年前

    ebnf是bnf的扩展/更新版本,因此问题变得更简单:ebnf与abnf。我不是专家,但我认为它应该取决于一种语言,你想定义它的语法。还有一些ebnf的可视化工具( http://www.google.co.il/search?sourceid=chrome&ie=UTF-8&q=Ebnf-Visualizer 但是没有看到任何关于ABNF的信息,

        4
  •  1
  •   Hibou57    10 年前

    一个合理的选择建议使用EBNF,因为它是一个ISO标准: ISO/IEC 14977 : 1996(E) [PDF]。例如,它用于OMG UML Human-Usable Textual Notation .

        5
  •  0
  •   Mahesh Velaga    14 年前

    你可以通过使用它们中的任何一个来实现你想要的,但是每一个都是简洁有效的,根据你的语言所包含的特性来表示你的语言。

    我读过 BNF , EBNF ABNF 从维基百科,它描述了一些不同之处,以及为什么ebnf和abnf出现在基于bnf的图片中。

    推荐文章