ebnf范式_BNF范式(巴科斯范式)简介

BNF就是巴科特·瑙尔式的缩写, 在计算机的史前时代(1950s),曾有一位大师,他奠定了现代计算机的基础,在他老人家的诸多成就之中,包括了对形式语言的研究,和发明了高级语言:FORTRAN。 为了纪念他老人家,我们把他提出的一套描述语言的方法叫做BNF。它以递归方式描述语言中的各种成分,凡遵守其规则的程序就可保证语法上的正确性。BNF由于其简洁、明了、科学而被广泛接受,成为描述各种程序设计语言的最常用的工具。

其实BNF很简单,::=表示定义     |表示或    尖括号(<>)括起来的是非终结符

所谓非终结符就是语言中某些抽象的概念不能直接出现在语言中的符号,终结符就是可以直接出现在语言中的符号。

比如:C语言的声明语句可以用BNF这样描述:

::= ; | [];

这一句中这个非终结符被定义成了两种形式(上面用|隔开的两部分),同时在这里引入了三个终结符: 分号; 左方括号[,右方括号 ]。

::= | |

::= * | *

::= int|char|double|float|long|short|void

::= enum|struct|union|

到这里就基本上把定义清楚了。

::= 0x | 0 |

::= |

::= |

::= |

::= | A | B | C | D | E | F

::= | 8 | 9

::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7

到这里就把定义清楚了

::= |

::= |||

::= _ | |

::= a|b|c|d|e|f|g|h|i|j ……

::= A|B|C|D|E|F|G|H|I|J ……

到此为止整个声明语句就定义完了(就是说已经没有非终结符了)。

虽然看起来很繁,但前面定义的各种非终结符都可以很容易的在别的地方重用。比如,函数声明可以定义成下面的样子:

::= ();

::= | ,

只用两句就描述完了,所以BNF实际上比用自然语言要简练得多(整个C语言只用一二百句就可以描述清楚),而且相当的精确,不会有自然语言中那种模棱两可的表达。如果你对BNF比较敏感的话,会发现C里面的标识符不能由数字开头,而且在C里面下划线是被当做字母看待的(也就是说能用字母的地方都可以用下划线)。

另外,还有一种EBNF就没有正宗的BNF这么爽了,也有很多人在用,前面的那些递归的定义被写成了{}。

有一段时间PASCAL爱好者们喜欢用一个叫语法图的东西,画出来很难看,但功能和BNF差不多,现在好象已经没多少人用了。

近几年流行另一种东西:

digit = one of 0 1 2 3 4 5 6 7 8 9

这里非终结符digit用斜体表示,one of是这种方法里定义的一个量词(常用斜黑体)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值