F88a5e3073781b88c02eaadec9945d58
Python语法分析(三)

Python语法分析(三)

上文的最后,我们提到了Python的语法描述里面定义了很多实际编程中无法感知的“中间形式”。今天我们就接着这个问题继续探讨Python的语法分析。

BNF

在研究我们问题之前,我们需要了解一个词汇:BNF

BNF全称Backus-Naur Form,描述语言的形式化的数学方法。它的作用类似一种数学游戏:从一个符号开始(叫做起始标志,实例中常用S表示),然后给出替换前面符号的规则。BNF语法定义的语言只不过是一个字符串集合,你可以按照下述规则书写,这些规则叫做书写规范(生产式规则),形式如下:

symbol := alternative1 | alternative2 ...

Ok,我们不再去完整摘抄具体的BNF定义描述,我们看看上述的公式,是不是和我们在《Python语法分析(一)》中描述的很类似?

所以没错,现在绝大多数语言的文法描述都采用的是BNF的方式。

Python呢,采用的一种自己稍微修改过形式BNF描述。其官方定义可见文档,简要描述有以下几个特点:

  • 竖线 | 用于分隔可相互替换的内容;| 是这种标记法中优先级最低的符号。
  • 星号 * 意味着对前一项的零或多次重复。
  • 加号 + 意味着对前一项至少重复一次。
  • 方括号 [] 中的词组会发生零次或一次(或说,括号内的词组是可选的)。
  • 圆括号 () 用于分组。
  • 字符串字面量会被放在双引号中 ""
  • 空白符仅在分隔符号时有意义。
  • 被三个点号 ...分隔开的字符字面量表示在给定的 ASCII 字符范围内,可任选一个字符(选择范围包含已给定的两个字符)。
  • 在尖括号 <...> 中给出的短语phrase用于给出符号定义的非正式描述。
  • 和 + 运算符具有最高的优先级。

有点难以理解是不是,我们分别从找几个例子来熟悉熟悉:

  • 竖线:

    augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' |
                '<<=' | '>>=' | '**=' | '//=')
  • 星号:

    dotted_name: NAME ('.' NAME)*
  • 字符串字面量:

    break_stmt: 'break'
    continue_stmt: 'continue'

其余的不再赘述,留给读者自行阅读文档理解和挖掘。

top Created with Sketch.