我想提出一种语言语法。我已经阅读了一些关于这三个的内容,并且看不到任何一个人能做到而另一个人不能做到的事情。有什么理由使用一个而不是另一个?还是只是偏好问题?
6 回答
您必须将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作为语法选择的语言将使您的工作更轻松,因为您将更有表现力,而无需使用解析器生成器生成的无用符号填充您的语法,但您不会关心他们!
根据 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 添加了区分大小写的字符串文字。
EBNF 是 BNF 的扩展/更新版本,因此问题变得更简单:EBNF 与 ABNF。我不是专家,但认为它应该取决于您要定义其语法的语言。还有一些 EBNF 的可视化工具(http://www.google.co.il/search?sourceid=chrome&ie=UTF-8&q=Ebnf-Visualizer),但没有看到任何 ABNF,
一个合理的选择是建议使用 EBNF,因为它是 ISO 标准:ISO/IEC 14977 : 1996(E) [pdf]。例如,它用于 OMG 的UML Human-Usable Textual Notation。