38

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

4

6 回答 6

36

您必须将EBNFABNF视为扩展,以帮助您在开发语法时更加简洁和富有表现力。

例如,考虑一个可选的非终结符号,在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

这对于EBNFABNF语法中允许的许多语法问题是正确的,这要归功于语法糖,但不是普通的BNFABNF扩展了EBNF,允许你做更复杂的事情,比如指定一个符号可以一起出现多少次(即4*DIGIT

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

于 2010-04-04T16:46:50.117 回答
6

根据 Wikipedia,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://www.rfc-editor.org/rfc/rfc7405

于 2015-04-26T09:22:08.980 回答
2

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

于 2010-04-04T16:50:26.993 回答
1

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

于 2014-02-16T15:02:59.640 回答
0

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

我从维基百科阅读了BNFEBNFABNF,它描述了一些差异以及为什么 EBNF 和 ABNF 是基于 BNF 出现的

于 2010-04-04T16:29:53.107 回答
0
于 2021-05-28T20:24:56.060 回答