BNF vs EBNF vs ABNF:选择哪个?

Jas*_*ker 28 syntax grammar bnf ebnf

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

Jac*_*ack 29

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

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

A        ::= OPTIONAL OTHER
OPTIONAL ::= opt_part | epsilon
Run Code Online (Sandbox Code Playgroud)

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

A ::= [opt_part] OTHER
Run Code Online (Sandbox Code Playgroud)

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

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

EBNF
A ::= (a | b | c) C
Run Code Online (Sandbox Code Playgroud)

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

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

  • 另外:IETF使用ABNF.ABNF比EBNF更方便. (4认同)
  • 相对于4*DIGIT:使用相同的语法可以在EBNF中完成相同的操作. (2认同)

tro*_*olo 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