JS内容程序员首页投稿(暂停使用,暂停投稿)

语法格式描述规范BNF、EBNF、ABNF

2017-09-22  本文已影响0人  科研者

由于经常研究东西,所以经常涉及语法的定义;以前我都是按照我自己定义的一套语法格式描述规则来进行严谨地描述语法格式,但是我自己设计的这套语法格式描述规则并不通用,所以决定改为通用的语法格式描述规则--EBNF(扩展的巴科斯范式) 或 ABNF(增强型巴科斯范式),本文就详细讲讲 BNF、EBNF、ABNF 这三者之间的关系与区别;

1. 简介

BNFEBNFABNF 这三者的表达能力是等效的;它们只是语法上的差异。

通常,BNF 更适合教学、解释和理论讨论。EBNF 和 ABNF 经常用于语法定义 和 解析器解析,其中 ABNF 更加利于解析器解析;

2. 巴科斯范式BNF

巴科斯范式的英文缩写为BNF,它是以美国人巴科斯(Backus)和丹麦人诺尔(Naur)的名字命名的一种形式化的语法表示方法,用来描述语法的一种形式体系,是一种典型的元语言。又称巴科斯-诺尔形式(Backus-Naur form)。它不仅能严格地表示语法规则,而且所描述的语法是与上下文无关的。它具有语法简单,表示明确,便于语法分析和编译的特点。

BNF表示语法规则的方式为:

BNF中常用的元字符及其表示的意义如下:

3. 扩展的巴科斯范式EBNF

EBNF,EBNFExtended BNF 的缩写,意思是扩展的巴科斯范式。用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。

扩展巴科斯-瑙尔范式(EBNF)是表达作为描述计算机编程语言和形式语言的正规方式的上下文无关文法的元语法符号表示法。它是基本巴科斯范式(BNF)元语法符号表示法的一种扩展。

它最初由尼古拉斯·沃斯开发,最常用的 EBNF 变体由标准,特别是 ISO-14977 所定义。

3.1. EBNF符号表

下面是 推荐标准ISO/IEC 14977 所定义的符号及其含义

3.2. EBNF语法的定义

用 EBNF范式 来描述 EBNF 的语法

生成式 = 生成式名 '=' [ 表达式 ] [';'] ;
表达式 = 选择项 { '|' 选择项 } ;
选择项 = 条目 { 条目 } ;
条目   = 生成式名 | 标记 [ '…' 标记 ] | 分组 | 可选项 | 重复项 ;
分组   = '(' 表达式 ')' ;
可选项 = '[' 表达式 ']' ;
重复项 = '{' 表达式 '}' ;

生成式由表达式构造,表达式通过术语及以下操作符构造,自上而下优先级递增(低=>高):

|   选择
()  分组
[]  可选(0 或 1 次)
{}  重复(0 到 n 次)

小写生成式名用于标识词法标记。非终结符使用驼峰记法。 位于引号 '...' 内的即为终结符。

形式 a … b 表示把从 ab 的字符集作为选择项。 横向省略号 也在本文档中非正式地表示各种列举或简略的代码片断。

4. 增强型巴科斯范式ABNF

RFC2234 定义了增加型巴科斯范式(ABNF)。近年来在Internet的定义中 ABNF 被广泛使用。ABNF 做了更多的改进。增强型巴科斯-瑙尔范式(ABNF)基于了巴科斯-瑙尔范式(BNF),但由它自己的语法和推导规则构成。这种元语言的发起原则是描述作为通信协议(双向规范)的语言的形式系统。它建档于 RFC 4234 中通常充当 IETF 通信协议的定义语言。

4.1. 推导规则

ABNF 规定是一组推导规则,写为:

规则 = 定义 ; 注释 CR LF

说明:

4.2. 操作符

空白被用来分隔定义的各个元素: 要使空格被识别为分割符则必须明确的包含它。

4.3. 串联

规则1 规则2

规则可以通过列出一序列的规则名字来定义。

示例:
要匹配字符串“aba”可以使用下列规则:

fu = %x61; a
bar = %x62; b
mumble = fu bar fu

4.4. 选择

规则1 / 规则2

规则可以通过用反斜杠(“/”)分隔的多选一规则来定义。

示例:
要接受规则 <fu> 或规则 <bar> 可构造如下规则:

fubar = fu / bar

4.5. 递增选择

规则1 =/ 规则2

可以通过使用在规则名字和定义之间的“=/”来向一个规则增加补充选择。

示例:
规则

ruleset = alt1 / alt2 / alt3 / alt4 / alt5

等价于

ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5

4.6. 值范围

%c##-##

数值范围可以通过使用连字符(“-”)来指定。

示例:
规则

OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"

等价于

OCTAL = %x30-37

4.7. 序列分组

(规则1 规则2)

元素可以放置在圆括号中来组合定义中的规则。

示例:
要匹配“elem fubar snafu”或“elem tarfu snafu”可以构造下列规则:

group = elem (fubar / tarfu) snafu

要匹配“elem fubar”或“tarfu snafu”可以构造下列规则:

group = elem fubar / tarfu snafu
group = (elem fubar) / (tarfu snafu)

4.8. 可变重复

n*m规则

要指示一个元素的重复可以使用形式 <a>*<b>元素。可选的 <a> 给出要包括的元素的最小数目,缺省为 0。可选的 <b> 给出要包括的元素的最大数目,缺省为无穷。
对零或多个元素使用 *元素,对一或多个元素使用 1*元素,对二或三个元素使用 2*3元素

4.9. 特定重复

n规则

要指示明确数目的元素可使用形式 <a>元素,它等价于 <a>*<a>元素
使用 2DIGIT 得到两个数字,使用 3DIGIT 得到三个数字。(DIGIT 在下面的核心规则中定义)。

4.10. 可选序列

[规则]

示例:
要指示可选元素下列构造是等价的:

[fubar snafu]
*1(fubar snafu)
0*1(fubar snafu)

4.11. 注释

; 注释

分号(“;”)开始一个注释并持续到此行的结束。

4.12. 操作符优先级

上述操作符有从最紧绑定(binding)到最松绑定的给定优先级:

  1. 字符串,名字形成(formation)
  2. 注释
  3. 值范围
  4. 重复
  5. 分组,可选
  6. 串联
  7. 选择

与串联一起使用选择操作符可以造成混淆,建议使用分组来做明确串联分组。

4.13. 核心规则

核心规则定义于 ABNF 标准中;


核心规则.png

5. 郭斌勇版巴科斯范式EBNF-GBY

对于会正则表达工式的人来说,可能不喜欢喜欢EBNF的重复规则,而更喜欢正则表达工的重复规则(正如我的喜好一样),为了实现类正则的巴科斯范式,我便定义了郭斌勇版巴科斯范式EBNF-GBY;

郭斌勇版巴科斯范式EBNF-GBY是基本ABNF修改和扩展的,相对于EBNF,有如下区别:

5.1. 修改

弃用 ABNF中的重复规则 和 EBNF中的可重复项表示{ },改用如下正则表达式的重复规则,如下:

规则{min,max}

表示规则重复次数大于或等于min次,小于或等于max次;

min表示最小的重复次数,默认值为0
max表示最大的重复次数,默认值为无穷大
min或者max被省略时,min或者max取相应默认值;

规则{n}

等价于:

规则{n,n}

表示规则重复n次;

5.2. 增加

相对ABNF,增加以下元字符:

? : 表示前面的规则重复零次或一次;等价于`{0,1}`;
+ : 表示前面的规则重复一次或多次(大于等于1次);等价于`{1,}`;
* : 表示前面的规则重复任意次;等价于`{0,}`;
上一篇 下一篇

猜你喜欢

热点阅读