您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

Python语言手册中的BNF介绍

Python语言手册中的BNF介绍

BNF是巴科斯范式,是一种用递归的思想来表述计算机语言符号集的定义规范。

BNF (Backus Normal Form) is a notation technique for context-free grammars, often used to describe the syntax of languages used in computing.【BNF(Backus Normal Form)是一种上下文无关语法的表示方法,通常用于描述计算语言的语法。】

符号约定如下:

双引号中的词("word")代表着这些字符本身。而double_quote用来代表双引号。

在双引号外的词(有可能有下划线)代表着语法部分。

每条规则以名字(这条规则定义的名字)和 ::= 作为开头——被定义为的意思

竖线 (|) 用于分隔可相互替换的内容——相当于"OR"的意思;| 是这种标记法中优先级最低的符号。

星号 (*) 意味着对前一项的零或多次重复。

加号 (+) 意味着对前一项至少重复一次,* 和 + 运算符具有最高的优先级。

方括号 ([]) 中的词组(phrase)会发生零次或一次(或说,括号内的词组是可选的)。

圆括号 (())用于分组。

字符串字面量会被放在双引号中 ("") 。

空白符 ( ) 仅在分隔符号(tokens)时有意义。

被三个点号 ... 分隔开的字符字面量表示在给定的 ASCII 字符范围内,可任选一个字符(选择范围包含已给定的两个字符)。如digit ::=  "0"..."9"

在尖括号 (<...>) 中给出的短语(phrase) 用于给出符号定义的非正式描述。

 

斜体字 参数。

 

当某个句法拥有形如 name ::= othername 的规则时—— 也可能是众多并列项中的某个具有这种形式 —— 则表明在此项规则下 name 拥有与 othername 相同的语义。

 

Python词汇规范使用它们。

在这些语法中:

后缀*表示“重复0次或更多次”

后缀+表示“重复1次或更多次”

后缀?表示“0或1次”

 

例、Python中浮点文本的定义是组合几种符号的一个很好的例子:

浮点数字面值词法定义如下( https://docs.python.org/zh-cn/3/reference/lexical_analysis.html#floating

floatnumber   ::=  pointfloat | exponentfloat

pointfloat    ::=  [digitpart] fraction | digitpart "."

exponentfloat ::=  (digitpart | pointfloat) exponent

digitpart     ::=  digit (["_"] digit)*

fraction      ::=  "." digitpart

exponent      ::=  ("e" | "E") ["+" | "-"] digitpart

注意,解析时,整数和指数部分总以 10 为基数。例如,077e010 是合法的,表示的数值与 77e10 相同。浮点数字面值的支持范围取决于具体实现。整数字面值支持用下划线分组数字。

浮点数字面值示例如下:

3.14    10.    .001    1e100    3.14e-10    0e0    3.14_15_93

 

又如列表( https://docs.python.org/zh-cn/3/library/stdtypes.html#list

class list([iterable])

斜体字 参数。

 

下面给出一个比较复杂的例子

函数定义——用户自定义函数的定义(https://docs.python.org/zh-cn/3/reference/compound_stmts.html#function :

funcdef                   ::=  [decorators] "def" funcname "(" [parameter_list] ")"

                               ["->" expression] ":" suite

decorators                ::=  decorator+

decorator                 ::=  "@" assignment_expression NEWLINE

parameter_list            ::=  defparameter ("," defparameter)* "," "/" ["," [parameter_list_no_posonly]]

                                 | parameter_list_no_posonly

parameter_list_no_posonly ::=  defparameter ("," defparameter)* ["," [parameter_list_starargs]]

                               | parameter_list_starargs

parameter_list_starargs   ::=  "*" [parameter] ("," defparameter)* ["," ["**" parameter [","]]]

                               | "**" parameter [","]

parameter                 ::=  identifier [":" expression]

defparameter              ::=  parameter ["=" expression]

funcname                  ::=  identifier

 

python的一个函数定义可以被一个或多个 decorator(装饰器) 表达式所包装,显得有点复杂。

 

 


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进