BNF 范式

什么是 BNF 范式

BNF(Backus-Naur Form) 巴克斯范式用来描述语法规则的语法。 使用场景如下:

  1. C 语言的 BNF 描述
  2. CSS 语法规则描述
  3. linux 指令使用的描述,使用 man <command_name> 查看指令时看到的 SYNOPSIS 极为 bnf 的语法描述。

为什么需要学习 bnf

理解 bnf 除了能够更好的读懂各种类 bnf 的语法描述外。 可以利用 bnf 的思想来抽象编程问题。

BNF 的规则描述

BNF 利用符号来进行规则定义,相关符号的含义如下表。 这里 bnf 不仅仅指基础的巴克斯范式还包括 ABNF 规则。

符号 作用
::= 表示被定义为,有时也可用 =
| 表示或逻辑
/ 表示选择
<> 表示一个属性或类型
结束符
空格表示连接符
[] 括号中内容可选
{} 表示对前面内容的重复次数,其中可以填入数字,类似正则
() 括号中的内容为一组

规则举例

<> 用来包含规则名

范例:

name =  <rulename> | rulename

规则名不区分大小写,也可以不带尖括号

空格对多个属性进行分隔

范例:

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

利用空格,分号给一个规则赋值时多个属性的方法

/ 选择

范例:

  foo / bar

/ 表示从这 foo 或 bar 中选择一个

() 序列组

范例: (elem foo) / (bar blat)

括号表示一个序列组

不定循环

范例:

<a>*<b>element  //元素 element 至少出现 a 此至多 b 次
*<element>      //出现任意次数
3*3<element>    //只出现 3 次
1*<element>     //至少 1 次
1*2<element>    //这是1-2 次

默认值 0 * ∞ <element>

指定循环

范例:

<n>element
等同于
<n>*<n>element

相当于只使用 n 次某元素

可选序列

范例:

[foo bar]
等同于
*1(foo bar)

表明某一规则只出现 0 或 1 次

参考资料

BNF 注释

ABNF