为帮助同志们清除一切在python学习道路上的阻碍,尤其是对于python文档有着丰富兴趣的同好们.本着前人栽树后人乘凉的想法,我将我近期在python文档阅读方面遇到的问题-即BNF范式 进行一个简单的讲解.鄙人才疏学浅如有疏漏恳请各位谅解.如有错误请联系本人删除.
为帮助各位可以立刻解决眼前的问题.本文章将采取速成-概念的步骤进行.诸位可以凭需跳转文章.
目录
1.速成
我们取The Python Language Reference 3.9.17文档中整数字面值词法定义为例:
integer ::= decinteger | bininteger | octinteger | hexinteger
......
为了减少不必要的麻烦,这里自动将其内容翻译为中文,以便各位更加直观的理解:
整数 ::= 十进制整数 | 二进制整数 | 八进制整数 | 十六进制整数
十进制整数 ::= 不含零的数字 (["_"] 数字)* | "0"+ (["_"] "0")*
二进制整数 ::= "0" ("b" | "B") (["_"] 二进制数字)+
八进制整数 ::= "0" ("o" | "O") (["_"] 八进制数字)+
十六进制整数 ::= "0" ("x" | "X") (["_"] 十六进制数字)+
不含零的数字 ::= "1"..."9"
数字 ::= "0"..."9"
二进制数字 ::= "0"|"1"
八进制数字 ::= "0"..."7"
十六进制数字 ::= 数字 | "a"..."f" | "A"..."F"
(所有已知内容会在下方出现)
第一句:
整数 ::= 十进制整数 | 二进制整数 | 八进制整数 | 十六进制整数
已知"::="是定义为的意思,"|"是或的意思。那么可知:
整数的定义为由十进制整数或二进制整数或八进制整数或十六进制整数构成的。
第二句:
十进制整数 ::= 不含零的数字 (["_"] 数字)* | "0"+ (["_"] "0")*
已知"()"用于分组无实际意义,"[]"表示可选内容,即出现一次或零次(无括号的为必选内容,即必出现一次)。""""是字符(元素) "*"表示前一项零次或多次重复。可知:
十进制整数的定义为不含零的数字后面出现零次或多次(跟或不跟(上_)后面跟上数字)
eg:1_000_000
1为不含零的数字,_可以出现也可以不出现,000为数字或0
第三句:
二进制整数 ::= "0" ("b" | "B") (["_"] 二进制数字)+
已知"+"表示前一项一次或多次重复。可知:
二进制整数的定义为0后面跟上b或B再一次或多次出现(跟或不跟上"_"跟上二进制数字)
eg:0b100110111
0为0,b为b,后面出现了一次或多次二进制数字
第四句:
八进制整数 ::= "0" ("o" | "O") (["_"] 八进制数字)+
八进制整数的定义为0后面跟上o或O再一次或多次出现(跟或不跟上"_"跟上八进制数字)
eg:0o177
0为0,o为o,后面出现了一次或多次八进制数字
第五句:
十六进制整数 ::= "0" ("x" | "X") (["_"] 十六进制数字)+
十六进制整数的定义为0后面跟上x或X再一次或多次出现(跟或不跟上"_"跟上十六进制数字)
eg:0xdeadbeef
0为0,x为x,后面出现了一次或多次十六进制数字
第六句:
不含零的数字 ::= "1"..."9"
不含零的数字的定义为1到9
第七句:和第六句同理
第八句:和第六句同理
第九句:和第六句同理
第十句:
十六进制数字 ::= 数字 | "a"..."f" | "A"..."F"
十六进制数字的定义为数字或a到f或A到F构成
2.概念
BNF范式是一种上下文无关的语言,用于描述计算机语言的符号集的定义规范。它是一种使用递归的思想来表述语法规则的形式化表示方法,其中规则中的每个符号都由一个或多个非终结符组成,而非终结符又由其他符号组成。BNF范式具有语法简单、表示明确、便于语法分析和编译等特点,是实现代码解析的必要条件之一 。
EBNF为扩展的巴科斯范式不同的地方对于扩展的巴科斯范式有不一样的定义。比如在The Python Language Reference 3.9.17文档中的BNF范式,事实上应当是EBNF范式才对。该概念给初学者一种不明觉厉的样子,会让初学者退却,让人感到害怕去继续阅读。即使在网上搜索却也得不到让人满意的答案。最后甚至会让人放弃。但实际上只要冷静下来,将文档中的十六行话仔细揣摩就会发现人家讲的十分清楚。其中涉及到的概念完全足以支撑你将该文档完整阅读。
接下来我将说明各个符号的概念。(由于搜集相关资料极度困难,甚至到几乎不可能的地步。因此以下说明完全为个人经验,用来帮助大家理解文档。并非官方定义,也绝不是内容科学严谨的教学)
::= : 定义
| : 用来分隔可选项,它是此标注中绑定程度最低的操作符
* : 表示前一项的零次或多次重复
+ : 表示前一项的一次或多次重复
(* + 这两操作符的绑定最紧密)
[] : 表示括起来的内容出现零次或一次(或者说,这部分内容是可选的)
() : 用于分组
"" : 包含着字符串字面值
空格: 空格的作用仅限于分隔形符
接下来我将说明语法:
BNF范式展现某一定义由哪些概念构成,某一概念又由哪些概念构成,以及原子概念的具体含义。
因此BNF范式的语法一般为:构成定义的概念,概念由哪些概念构成,概念的概念三部分。部分内容可以省略。
3.结语
我不擅长教学,即使是简单的概念也会让我弄的复杂。只是希望我可以在大家找不到BNF范式资料的时候可以提供一定的参考。