Jac*_*ack 29
您必须将EBNF和ABNF视为扩展,以帮助您在开发语法时更加简洁和富有表现力.
例如,考虑一个可选的非终端符号,在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)
这对于EBNF或ABNF语法中允许的许多语法问题都是如此,这要归功于语法糖而不是正常的BNF.ABNF扩展了EBNF,允许您执行更复杂的操作,例如指定可以一起找到符号的出现次数(即4*DIGIT
)
因此,选择ABNF或EBNF作为语法选择的语言将使您的工作更轻松,因为您将更加富有表现力,而不会使用无论如何由解析器生成器生成的无用符号填充您的语法,但您不会关心他们!
根据维基百科,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