Skip to main content

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)

附录 (Appendices)


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*mRulen到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


重复运算符详解

表示法含义示例匹配
*Rule0次或多次*DIGIT"", "1", "123"
1*Rule1次或多次1*DIGIT"1", "123"
2*4Rule2到4次2*4DIGIT"12", "123", "1234"
3Rule恰好3次3DIGIT"123"
[Rule]0次或1次["s"]"", "s"

运算符优先级

从高到低:

  1. 规则名称、组 - rulename, (group)
  2. 重复 - *, n*m, n
  3. 值范围、字符串 - %c##-##, "string"
  4. 连接 - Rule1 Rule2
  5. 备选项 - 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 对比

特性BNFABNF
规则定义::==
备选项``
分组<>()
可选-[]
重复-*, n*m
终端值引号引号 + 数值
注释各异;

实际应用

ABNF被广泛用于定义:

  • HTTP (RFC 7230, 7231等)
  • URI (RFC 3986)
  • SMTP (RFC 5321)
  • SIP (RFC 3261)
  • JSON (RFC 7159)
  • 几乎所有IETF协议

  • 官方原文: 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规范至关重要!