BNF 范式
什么是 BNF 范式
BNF(Backus-Naur Form) 巴克斯范式用来描述语法规则的语法。 使用场景如下:
- C 语言的 BNF 描述
- CSS 语法规则描述
- 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 次