照明灯企业网站织梦模板,html5教程零基础,网站如何建设与优化,做网站的备案什么是BNF范式,什么又是EBNF范式? 巴科斯范式及其扩展 BNF Augmented BNF 什么是巴科斯范式#xff1f; 巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。 现在 Augmented BNF 什么是巴科斯范式 巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。 现在几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。 巴科斯范式的内容 在双引号中的字(word)代表着这些字符本身。而double_quote用来代表双引号。 在双引号外的字有可能有下划线代表着语法部分。 尖括号( )内包含的为必选项。 方括号( [ ] )内包含的为可选项。 大括号( { } )内包含的为可重复0至无数次的项。 竖线( | )表示在其左右两边任选一项相当于OR的意思。 :: 是“被定义为”的意思。 巴科斯范式示例 这是用BNF来定义的Java语言中的For语句的实例 FOR_STATEMENT :: for ( ( variable_declaration | ( expression ; ) | ; ) [ expression ] ; [ expression ] ; ) statement 这是Oracle packages的BNF定义 package_body :: package package_name is package_obj_body { package_obj_body } [ begin seq_of_statements ] end [ package_name ] ; package_obj_body :: variable_declaration | subtype_declaration | cursor_declaration | cursor_body | exception_declaration | record_declaration | plsql_table_declaration | procedure_body | function_body procedure_body :: procedure procedure_name [ ( argument { , argument } ) ] return return_type is [ declare declare_spec ; { declare_spec ; } ] begin seq_of_statements [ exception exception_handler { exception_handler } ] end [ procedure_name ] ; statement :: comment | assignment_statement | exit_statement | goto_statement | if_statement | loop_statement | null_statement | raise_statement | return_statement | sql_statement | plsql_block 这是用BNF来定义的BNF本身的例子 syntax :: { rule } rule :: identifier :: expression expression :: term { | term } term :: factor { factor } factor :: identifier | quoted_symbol | ( expression ) | [ expression ] | { expression } identifier :: letter { letter | digit } quoted_symbol :: { any_character } 扩展的巴科斯范式 Augmented BNF RFC2234 定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中ABNF被广泛使用。ABNF做了更多的改进比如说在ABNF中尖括号不再需要。 什么是EBNF? 基本 (EBNF) 定义有关 EBNF 协定的详细情况可以参看 Computing Dictionary. 这里是要点一览: ... : 术语符号[...] : 选项:最多出现一次{...} : 重复项: 任意次数包括 0 次(...) : 分组| : 并列选项只能选一个
斜体字: 参数在其它地方有解释 http://estone.nease.net/sgf/sgf4.html#2 里会给出一个EBNF在棋牌类的应用. -------------------------------------------------------------------------------------------- BNF:: 非终结符::或项列表 或项列表:: 项 | 或项列表|项 项:: 非终结符 | 终结符 | 项非终结符 | 项终结符 非终结符:: 非终结符名 但愿能有人看得懂:-) ) BNF就是巴科特·瑙尔式的缩写 在计算机的史前时代1950s)曾有一位大师他奠定了现代计算机的基础 在他老人家的诸多成就之中包括了对形式语言的研究和发明了高级语言 FORTRAN。 为了纪念他老人家我们把他提出的一套描述语言的方法叫做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里面下划线是被当做字母看待的也就是说能用字母的地方 都可以用下划线比如最好用老一点的编译器比如PDP11上的cc #define ____ main #define ___ for typedef char* _____; int (*______)(char *, ...) printf; //如果这一句不灵就用下面这句 //#define ______ printf //如果你用的是C可以试一下下面这个 //int (*______)(const char *, ...) printf; ____(_,char* __[]) //要是你编译器不吃可以改成int ____(int _,char*__[]) { ___( ; _ ; _ --) { ______(%s\n, __[_]); } } 另外还有一种EBNF就没有正宗的BNF这么爽了也有很多人在用前面的 那些递归的定义被写成了{} 有一段时间PASCAL爱好者们喜欢用一个叫语法图的东西画出来很难看但 功能和BNF差不多现在好象已经没多少人用了 近几年流行另一种东西 digit one of 0 1 2 3 4 5 6 7 8 9 这里非终结符digit用斜体表示one of是这种方法里定义的一个量词常用斜黑体 我不喜欢这个因为我眼神不好常常分不清那个是斜体那个是正体