2. 记法约定 (Notational Conventions)
2 记法约定和通用语法
2.1 扩充 BNF (Augmented BNF)
本文档中规定的所有机制都同时用说明性文字和扩充 Backus-Naur Form (BNF) 描述, 该 BNF 类似 RFC 822 [9] 所用形式. 实现者需要熟悉这种记法, 才能理解本规范. 扩充 BNF 包含以下结构:
name = definition
规则名称就是名称本身 (不包含任何包围用的 "<" 和 ">"), 并由等号 "=" 字符与其定义分隔.
空白只在一种情况下有意义: 延续行的缩进用于表示跨越多行的规则定义.
某些基本规则使用大写, 如 SP, LWS, HT, CRLF, DIGIT, ALPHA 等.
当尖括号有助于辨别规则名称的使用时, 定义中会使用尖括号.
"literal" 引号包围字面文本. 除非另有说明, 该文本大小写不敏感.
rule1 | rule2 由竖线 ("|") 分隔的元素是可选项, 例如 "yes | no" 将接受 yes 或 no.
(rule1 rule2) 括号中的元素被视为单个元素. 因此, "(elem (foo | bar) elem)" 允许 token 序列 "elem foo elem" 和 "elem bar elem".
rule
元素前的字符 "" 表示重复. 完整形式为 "<n>*<m>element", 表示 element 至少出现 <n> 次,
至多出现 <m> 次. 默认值为 0 和无穷大, 因而 "(element)" 允许任意次数, 包括零次;
"1element" 要求至少一次; "1*2element" 允许一次或两次.
[rule] 方括号包围可选元素; "[foo bar]" 等价于 "*1(foo bar)".
N rule
特定重复: "<n>(element)" 等价于 "<n>*<n>(element)"; 即 (element) 恰好出现 <n> 次.
因此 2DIGIT 是一个 2 位数字, 3ALPHA 是一个由三个字母字符组成的字符串.
#rule
构造 "#" 的定义类似于 "*", 用于定义元素列表. 完整形式为 "<n>#<m>element",
表示至少 <n> 个且至多 <m> 个元素, 每个元素之间由一个或多个逗号 (",") 和 OPTIONAL linear white space (LWS) 分隔.
这使列表的常见形式很容易表达; 例如规则
( *LWS element *( *LWS "," *LWS element ))
可以表示为
1#element
使用该构造时, 允许空元素, 但空元素不计入当前元素数量. 也就是说,
"(element), , (element) " 是允许的, 但只计为两个元素. 因此, 当要求至少一个元素时,
MUST 至少存在一个非空元素. 默认值为 0 和无穷大, 因而 "#element" 允许任意数量, 包括零个;
"1#element" 要求至少一个; "1#2element" 允许一个或两个.
; comment 分号出现在规则文本右侧一定距离处时, 开始一个持续到行尾的注释. 这是在规范旁边并列加入有用说明的简单方式.
implied *LWS 本规范描述的语法以词为基础. 除另有说明外, linear white space (LWS) 可以包含在任意两个相邻词 (token 或 quoted-string) 之间, 以及相邻词和 separator 之间, 而不改变字段解释. 任意两个 token 之间 MUST 至少存在一个 delimiter (LWS 和/或 separator; "token" 的定义见下文), 因为否则它们会被解释为单个 token.
2.2 基本规则
以下规则在本规范全文中用于描述基本解析结构. US-ASCII 编码字符集由 ANSI X3.4-1986 [21] 定义.
OCTET = <any 8-bit sequence of data>
CHAR = <any US-ASCII character (octets 0 - 127)>
UPALPHA = <any US-ASCII uppercase letter "A".."Z">
LOALPHA = <any US-ASCII lowercase letter "a".."z">
ALPHA = UPALPHA | LOALPHA
DIGIT = <any US-ASCII digit "0".."9">
CTL = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
CR = <US-ASCII CR, carriage return (13)>
LF = <US-ASCII LF, linefeed (10)>
SP = <US-ASCII SP, space (32)>
HT = <US-ASCII HT, horizontal-tab (9)>
<"> = <US-ASCII double-quote mark (34)>
对除 entity-body 外的所有协议元素, HTTP/1.1 将序列 CR LF 定义为行尾标记 (关于宽容应用见附录 19.3). entity-body 内部的行尾标记由其关联 media type 定义, 如第 3.7 节所述.
CRLF = CR LF
如果延续行以 space 或 horizontal tab 开头, HTTP/1.1 header field value 可以折叠到多行. 所有 linear white space, 包括折叠, 与 SP 具有相同语义. recipient 在解释字段值或向 downstream 转发 message 前, MAY 将任意 linear white space 替换为单个 SP.
LWS = [CRLF] 1*( SP | HT )
TEXT 规则只用于描述性字段内容和值, 这些内容和值不打算由 message parser 解释. *TEXT 中的词 MAY 包含 ISO-8859-1 [22] 以外字符集的字符, 但只有在按照 RFC 2047 [14] 规则编码时才可以.
TEXT = <any OCTET except CTLs,
but including LWS>
在 TEXT 定义中, CRLF 只有作为 header field continuation 的一部分时才允许出现. 预期在解释 TEXT 值之前, 折叠 LWS 会被替换为单个 SP.
十六进制数字字符用于多个协议元素.
HEX = "A" | "B" | "C" | "D" | "E" | "F"
| "a" | "b" | "c" | "d" | "e" | "f" | DIGIT
许多 HTTP/1.1 header field value 由 LWS 或特殊字符分隔的词组成. 这些特殊字符如果要在 parameter value (如第 3.6 节定义) 内使用, MUST 位于 quoted string 中.
token = 1*<any CHAR except CTLs or separators>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
某些 HTTP header field 可以通过把注释文本放在括号中来包含 comment. 只有字段值定义中包含 "comment" 的字段才允许 comment. 在所有其他字段中, 括号被视为字段值的一部分.
comment = "(" *( ctext | quoted-pair | comment ) ")"
ctext = <any TEXT excluding "(" and ")">
如果文本字符串使用双引号引用, 则按单个词解析.
quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
qdtext = <any TEXT except <">>
反斜杠字符 ("") MAY 仅在 quoted-string 和 comment 构造中用作单字符引用机制.
quoted-pair = "\" CHAR