BNF和EBNF与ABNF:选择哪个?

时间:2010-04-04 16:19:59

标签: syntax grammar bnf ebnf

我想提出一种语言语法。我已经阅读了关于这三个的一些内容,并且无法真正看到任何人可以做的事情,而另一个人无法做到。有没有理由使用一个而不是另一个?或者只是一个偏好的问题?

6 个答案:

答案 0 :(得分:29)

您必须考虑 EBNF ABNF 作为扩展程序,以帮助您在开发语法时更加简洁和富有表现力。

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

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

使用 EBNF 时,您可以使用可选语法直接执行此操作:

A ::= [opt_part] OTHER

然后,因为无法在 BNF 中表达优先级,所以您必须始终使用中间符号作为嵌套选项:

BNF
A ::= B C
B ::= a | b | c

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

对于 EBNF ABNF 语法中允许的许多语法问题,这是正确的,这要归功于语法糖而不是正常 BNF ABNF 扩展 EBNF ,允许您执行更复杂的操作,例如指定可以一起找到符号的出现次数(即4*DIGIT

因此,选择 ABNF EBNF 作为语法选择的语言将使您的工作更轻松,因为您将更有表现力,而无需用无用的符号填充您的语法这将由您的解析器生成器生成,但您不会关心它们!

答案 1 :(得分:5)

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

  

通过使用括在引号(")中的字符串来指定文字文本。这些字符串不区分大小写,使用的字符集是(US-)ASCII。因此,字符串“abc”将匹配“abc”,“abc”,“aBc”,“abC”,“ABc”,“AbC”,“aBC”和“ABC”。对于区分大小写的匹配,必须定义显式字符:要匹配“aBc”,定义将为%d97.66.99

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

但是,RFC 7405似乎将区分大小写的字符串文字添加到ABNF。

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可以使用其中任何一种来实现您想要的效果,但每种语言都可以简洁有效地表示您的语言,具体取决于您的语言所包含的功能。

我已阅读维基百科中的BNFEBNFABNF,并描述了一些差异,以及为什么EBNF和ABNF根据BNF进行了描述

答案 5 :(得分:0)