我想提出一种语言语法。我读过一些关于这三个方面的文章,我真的看不到一个人可以做另一个人不能做的事情。有什么理由使用一个而不是另一个?或者这只是一个偏好的问题?
发布于 2010-04-05 00:46:50
您必须考虑将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作为语法的首选语言将使您的工作变得更容易,因为您将更具表现力,而不会使用解析器生成器无论如何都会生成的无用符号填充语法,但是您不会关心它们!
发布于 2015-04-26 17:22:09
根据维基百科的说法,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
但是,RFC7405似乎向ABNF添加了区分大小写的字符串文字。
发布于 2010-04-05 00:50:27
EBNF是BNF的扩展/更新版本,因此问题变得更简单: EBNF与ABNF。我不是专家,但我认为它应该依赖于一种您想要定义其语法的语言。还有一些用于EBNF (http://www.google.co.il/search?sourceid=chrome&ie=UTF-8&q=Ebnf-Visualizer)的可视化工具,但没有看到任何用于ABNF的可视化工具。
https://stackoverflow.com/questions/2575044
复制相似问题