巴科斯范式BNF

BNF范式

1960年提出,用于描述 ALGOL60语言。

BNF范式(巴科斯范式)是一种用递归的思想来表述计算机语言符号集的定义规范。 基本结构为 ::=

non-terminal意为非终止符,就是说我们还没有定义完的东西,还可以继续由右边的replacement,也就是代替物来进一步解释、定义。

描述语言的数学方法,是定义语言的语法,非常精确,没有歧义;

形似简单只包含三个符号:

符号 含义
::= 定义为
| 竖线两边的是可选内容,相当于or
<> 用来区分非终结符

举个例子:

<A>:== a |bc | c<B> 含义是:

可以把A替换成 a 或者 bc 或者 c

从一个符号开始,起始标志,给出替换前面符号的规则; 这些规则叫做书写规范,形式如下: symbol := alternative1 | alternative2 … :=左侧的符号必须被右侧某一个可选项代替; 替换项通常有两个符号和终结符构成,终结符代表书写过程终止; 另一种变化,把终止符放在引号中,与符号区分开; @表示符号可以去掉;

EBNF(Extended Backus–Naur form),是一个计算机用语,意思是扩展的巴科斯范式,用来描述计算机语言语法的符号集。

现在在网络上大多数能搜出来的都是extended BNF ,允许使用循环。

BNF例子

中文句子

<句子>::=<主语><谓语>
<主语>::=张三|李四
<谓语>::=<副词><动词>
<副词>::=深情地|狂野地
<动词>::=歌唱|奔跑

实际中例子

由于BNF的定义十分的简单,一些实际使用会增加他的功能。因为他足够简单,所以保持主要规则不变,仅增加一些说明语法,就可以描述。 例如Python的语法说明使用了改进过BNF来描述 Python3 Syntax Reference

Ruby的伪BNF描述 ruby-man-1.4/yacc

参考

Mark24

Everything can Mix.