跳到主要内容

4. ABNF 的 ABNF 定义

本节给出 ABNF 自身的 ABNF 定义. 该语法使用 ABNF 表示法定义.

代码块中的规则是 ABNF 元语法, 用来精确定义 rulelist,rule,alternation,concatenation,repetition,group,option,char-val,num-val 和 prose-val 等构造. 这些规则名和字面量必须保持原样, 因为任何翻译都会改变语法定义本身.

rulelist       =  1*( rule / (*c-wsp c-nl) )

rule = rulename defined-as elements c-nl
; continues if next line starts
; with white space

rulename = ALPHA *(ALPHA / DIGIT / "-")

defined-as = *c-wsp ("=" / "=/") *c-wsp
; basic rules definition and
; incremental alternatives

elements = alternation *c-wsp

c-wsp = WSP / (c-nl WSP)

c-nl = comment / CRLF
; comment or newline

comment = ";" *(WSP / VCHAR) CRLF

alternation = concatenation
*(*c-wsp "/" *c-wsp concatenation)

concatenation = repetition *(1*c-wsp repetition)

repetition = [repeat] element

repeat = 1*DIGIT / (*DIGIT "*" *DIGIT)

element = rulename / group / option /
char-val / num-val / prose-val

group = "(" *c-wsp alternation *c-wsp ")"

option = "[" *c-wsp alternation *c-wsp "]"

char-val = DQUOTE *(%x20-21 / %x23-7E) DQUOTE
; quoted string of SP and VCHAR
; without DQUOTE

num-val = "%" (bin-val / dec-val / hex-val)

bin-val = "b" 1*BIT
[ 1*("." 1*BIT) / ("-" 1*BIT) ]
; series of concatenated bit values
; or single ONEOF range

dec-val = "d" 1*DIGIT
[ 1*("." 1*DIGIT) / ("-" 1*DIGIT) ]

hex-val = "x" 1*HEXDIG
[ 1*("." 1*HEXDIG) / ("-" 1*HEXDIG) ]

prose-val = "`<" *(%x20-3D / %x3F-7E) ">`"
; bracketed string of SP and VCHAR
; without angles
; prose description, to be used as
; last resort

关于 ABNF 定义的说明

ABNF 的 ABNF 定义展示了该表示法的自描述特性. 这些规则说明了如何使用 ABNF 自身形式化地定义 ABNF 语法.

关键观察:

  • 规则使用其所描述的相同运算符来定义
  • 该表示法是递归且自引用的
  • 这为 ABNF 元语言 (metalanguage) 提供了形式化规范
  • 实现解析器时应按此处的空白,注释,换行和增量替代规则处理输入, 不能只按普通文本拆分