Mark24
记录灵感、技术、思考
巴科斯范式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