1.2. 标注
句法和词法解析的描述采用经过改进的 BNF 语法标注。这包含以下定义样式:
第一行表示 name
是一个 lc_letter
之后跟零个或多个 lc_letter
和下划线。而一个 lc_letter
则是任意单个 'a'
至 'z'
字符。(实际上在本文档中始终采用此规则来定义词法和语法规则的名称。)
每条规则的开头是一个名称 (即该规则所定义的名称) 加上 ::=
。竖线 (|
) 被用来分隔可选项;它是此标注中最灵活的操作符。星号 (*
) 表示前一项的零次或多次重复;类似地,加号 (+
) 表示一次或多次重复,而由方括号括起的内容 ([ ]
) 表示出现零次或一次 (或者说,这部分内容是可选的)。*
和 +
操作符的绑定是最紧密的;圆括号用于分组。固定字符串包含在引号内。空格的作用仅限于分隔形符。每条规则通常为一行;有许多个可选项的规则可能会以竖线为界分为多行。
在词法定义中 (如上述示例),还额外使用了两个约定: 由三个点号分隔的两个字符字面值表示在指定 (闭) 区间范围内的任意单个 ASCII 字符。由尖括号 (<...>
) 括起来的内容是对于所定义符号的非正式描述;即可以在必要时用来说明 ‘控制字符’ 的意图。
虽然所用的标注方式几乎相同,但是词法定义和句法定义是存在很大区别的: 词法定义作用于输入源中单独的字符,而句法定义则作用于由词法分析所生成的形符流。在下一章节 (“词法分析”) 中使用的 BNF 全部都是词法定义;在之后的章节中使用的则是句法定义。