bnf

BNF范式

最近在学习关于词法/语法分析的知识,看到yacc采用BNF范式定义语法规则,此前没有接触过BNF,发现其实以前看过的许多文档中的协议与语法定义都是采用了BNF或扩充巴科斯范式(ABNF)和扩展巴克斯范式(EBNF)。之前在分析微软的SQL Server数据库的TDS协议文档时,还用了好久去总结符号标识的意义,现在看来是自己孤陋寡闻连大名鼎鼎的BNF都不懂。(一看就知道编译原理就没好好学)

几个简单概念

形式文法

一个形式文法G是下述元素构成的一个四元组N, Σ, P, S):

  • 非终结符号”集合N

  • 终结符号”集合Σ,Σ与N无交。

  • 产生式规则P

  • 起始符号SS属于N

引用自维基百科

通俗地理解,就是一个文法的解释,需要一个产生的规则,里边允许递推扩展文法,但是总需要一个终结符来结束这句话,不会无限的递推下去。而开始的标志则可以来源于非终结符号。

上下文无关文法

BNF是一种用于描述上下文无关语法的规范,那么什么是上下文无关文法呢?概念定义就不再叙述,意会地理解,即把上下文去掉,无视语境,这个词如何解释是不变的。

维基中的解释

BNF的应用

我们的自然语言通常来说都是需要语境的,就无法用BNF这样的上下文无关文法来定义。但是程序语言都是上下文无关的,都可以以BNF的形式定义出来。不过现在多数是以EBNF扩展巴克斯范式来定义的。

BNF语法

1
2
3
4
5
BNF范式的产生规则
BNF的元符号
::= 表示“定义为 ”
| 表示“或者”
< > 尖括号用于括起类别名字

EBNF语法

用途 符号表示
定义 =
串接 ,
终止 ;
分隔 |
可选 [ … ]
重复 {…}
分组 ( … )
单引号 ‘ … ‘
双引号 “ … “
注释 (* … *)
特殊序列 ? … ?
除外 -