1.2. 标注

句法和词法解析的描述采用经过改进的 BNF 语法标注。这包含以下定义样式:

  1. name ::= lc_letter (lc_letter | "_")*
  2. lc_letter ::= "a"..."z"

第一行表示 name 是一个 lc_letter 之后跟零个或多个 lc_letter 和下划线。而一个 lc_letter 则是任意单个 'a''z' 字符。(实际上在本文档中始终采用此规则来定义词法和语法规则的名称。)

每条规则的开头是一个名称 (即该规则所定义的名称) 加上 ::=。竖线 (|) 被用来分隔可选项;它是此标注中最灵活的操作符。星号 () 表示前一项的零次或多次重复;类似地,加号 (+) 表示一次或多次重复,而由方括号括起的内容 ([ ]) 表示出现零次或一次 (或者说,这部分内容是可选的)。+ 操作符的绑定是最紧密的;圆括号用于分组。固定字符串包含在引号内。空格的作用仅限于分隔形符。每条规则通常为一行;有许多个可选项的规则可能会以竖线为界分为多行。

在词法定义中 (如上述示例),还额外使用了两个约定: 由三个点号分隔的两个字符字面值表示在指定 (闭) 区间范围内的任意单个 ASCII 字符。由尖括号 (<…>) 括起来的内容是对于所定义符号的非正式描述;即可以在必要时用来说明 '控制字符' 的意图。

虽然所用的标注方式几乎相同,但是词法定义和句法定义是存在很大区别的: 词法定义作用于输入源中单独的字符,而句法定义则作用于由词法分析所生成的形符流。在下一章节 ("词法分析") 中使用的 BNF 全部都是词法定义;在之后的章节中使用的则是句法定义。