RFC 5234 - Augmented BNF for Syntax Specifications: ABNF
语法规范的扩充BNF: ABNF
发布日期: 2008年1月
状态: 互联网标准 (STD 68)
作者: D. Crocker (Brandenburg InternetWorking), P. Overell (THUS plc.)
废止: RFC 4234
摘要 (Abstract)
互联网技术规范通常需要定义正式的语法。多年来,一种修改后的巴科斯-瑙尔范式 (BNF, Backus-Naur Form),称为扩充BNF (ABNF, Augmented BNF),在许多互联网规范中很受欢迎。当前规范记录了ABNF。它在紧凑性和简单性与合理的表示能力之间取得了平衡。标准BNF和ABNF之间的差异涉及命名规则、重复、备选项、顺序无关性和值范围。本规范还为几个互联网规范中常见的核心词法分析器类型提供了额外的规则定义和编码。
本备忘录状态 (Status of This Memo)
本文档为互联网社区指定了一个互联网标准跟踪协议,并请求讨论和改进建议。有关本协议的标准化状态和状态,请参阅"互联网官方协议标准"(STD 1)的当前版本。本备忘录的分发不受限制。
目录 (Table of Contents)
- 1. Introduction (简介)
- 2. Rule Definition (规则定义)
- 2.1. Rule Naming (规则命名)
- 2.2. Rule Form (规则形式)
- 2.3. Terminal Values (终端值)
- 2.4. External Encodings (外部编码)
- 3. Operators (运算符)
- 3.1. Concatenation (连接)
- 3.2. Alternatives (备选项)
- 3.3. Incremental Alternatives (增量备选项)
- 3.4. Value Range Alternatives (值范围备选项)
- 3.5. Sequence Group (序列组)
- 3.6. Variable Repetition (可变重复)
- 3.7. Specific Repetition (特定重复)
- 3.8. Optional Sequence (可选序列)
- 3.9. Comment (注释)
- 3.10. Operator Precedence (运算符优先级)
- 4. ABNF Definition of ABNF (ABNF的ABNF定义)
- 5. Security Considerations (安全考虑)
- 6. References (参考文献)
- 6.1. Normative References (规范性参考文献)
- 6.2. Informative References (信息性参考文献)
附录 (Appendices)
- Appendix A. Acknowledgements (致谢)
- Appendix B. Core ABNF of ABNF (ABNF的核心规则)
- B.1. Core Rules (核心规则)
- B.2. Common Encoding (常见编码)
ABNF核心概念
什么是ABNF?
ABNF (Augmented BNF) 是一种用于定义语法的元语言,广泛用于互联网协议规范中。它是对经典巴科斯-瑙尔范式 (BNF) 的扩展。
基本语法
规则定义:
rulename = elements
示例:
postal-address = name-part street zip-part
name-part = *(personal-part SP) last-name [SP suffix] CRLF
核心运算符
| 运算符 | 语法 | 说明 | 示例 |
|---|---|---|---|
| 连接 | Rule1 Rule2 | 顺序连接 | "http" "://" |
| 备选项 | Rule1 / Rule2 | 选择其一 | "yes" / "no" |
| 增量备选 | Rule1 =/ Rule2 | 添加备选项 | digit =/ "A" |
| 值范围 | %c##-## | 字符范围 | %x30-39 (0-9) |
| 可选 | [Rule] | 零次或一次 | ["s"] |
| 重复 | *Rule | 零次或多次 | *DIGIT |
| 特定重复 | nRule | 恰好n次 | 3DIGIT |
| 范围重复 | n*mRule | n到m次 | 1*3DIGIT |
| 分组 | (Rule1 Rule2) | 组合规则 | ("http" / "https") |
| 注释 | ; comment | 注释 | ; 这是注释 |
核心规则 (Core Rules)
ABNF定义了一组核心规则,常用于各种规范:
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
DIGIT = %x30-39 ; 0-9
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
DQUOTE = %x22 ; " (双引号)
SP = %x20 ; 空格
HTAB = %x09 ; 水平制表符
WSP = SP / HTAB ; 空白
LWSP = *(WSP / CRLF WSP) ; 线性空白
VCHAR = %x21-7E ; 可见(打印)字符
CHAR = %x01-7F ; 任何7位US-ASCII字符
OCTET = %x00-FF ; 8位数据
CTL = %x00-1F / %x7F ; 控制字符
CR = %x0D ; 回车
LF = %x0A ; 换行
CRLF = CR LF ; 回车换行
BIT = "0" / "1"
实用示例
示例1: 简单的规则
greeting = "Hello" SP name
name = 1*ALPHA
匹配: Hello John, Hello Alice
示例2: 电子邮件地址(简化版)
email = local-part "@" domain
local-part = 1*(ALPHA / DIGIT / "." / "-" / "_")
domain = subdomain *("." subdomain)
subdomain = 1*(ALPHA / DIGIT / "-")
匹配: [email protected], [email protected]
示例3: HTTP版本
HTTP-version = "HTTP/" 1*DIGIT "." 1*DIGIT
匹配: HTTP/1.1, HTTP/2.0
示例4: URI方案
scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
匹配: http, https, ftp, mailto
重复运算符详解
| 表示法 | 含义 | 示例 | 匹配 |
|---|---|---|---|
*Rule | 0次或多次 | *DIGIT | "", "1", "123" |
1*Rule | 1次或多次 | 1*DIGIT | "1", "123" |
2*4Rule | 2到4次 | 2*4DIGIT | "12", "123", "1234" |
3Rule | 恰好3次 | 3DIGIT | "123" |
[Rule] | 0次或1次 | ["s"] | "", "s" |
运算符优先级
从高到低:
- 规则名称、组 -
rulename,(group) - 重复 -
*,n*m,n - 值范围、字符串 -
%c##-##,"string" - 连接 -
Rule1 Rule2 - 备选项 -
Rule1 / Rule2
示例:
foo = "a" *("b" / "c")
匹配: a, ab, ac, abc, abb, acc, abbc, ...
终端值表示
字符串
command = "GET" / "POST"
数值 (十六进制)
CR = %x0D ; 回车
LF = %x0A ; 换行
数值范围
DIGIT = %x30-39 ; 0-9
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
序列值
CRLF = %x0D.0A ; 回车换行序列
ABNF vs BNF 对比
| 特性 | BNF | ABNF |
|---|---|---|
| 规则定义 | ::= | = |
| 备选项 | ` | ` |
| 分组 | <> | () |
| 可选 | - | [] |
| 重复 | - | *, n*m |
| 终端值 | 引号 | 引号 + 数值 |
| 注释 | 各异 | ; |
实际应用
ABNF被广泛用于定义:
- HTTP (RFC 7230, 7231等)
- URI (RFC 3986)
- SMTP (RFC 5321)
- SIP (RFC 3261)
- JSON (RFC 7159)
- 几乎所有IETF协议
相关资源 (Related Resources)
- 官方原文:
https://www.rfc-editor.org/rfc/rfc5234.txt - 官方页面:
https://datatracker.ietf.org/doc/html/rfc5234 - 标准: STD 68
- 废止: RFC 4234
- 相关RFC:
- RFC 2234 (ABNF的前一版本)
- RFC 7405 (ABNF的大小写敏感扩展)
重要提示: ABNF是互联网协议规范的基础工具。理解ABNF对于阅读和实现RFC规范至关重要!