ABNF

**ABNF**（**Augmented Backus–Naur form**）は、バッカス・ナウア記法 (BNF) の拡張の一種。構文規則や生成規則はBNFとは異なる。通信プロトコルなどの言語の形式体系を記述するメタ言語として開発された。 で文書化されており、IETF が通信プロトコルを定義する際によく使っている。**拡張バッカス・ナウア記法**とも呼ばれるが、EBNF（Extended Backus-Naur Form）も同じ訳語となるため、区別するためあえて **ABNF** としている。

 は、および に存在した問題を修正し置換したものである。

## 概要
ABNFの記述は以下のような生成規則群からなる。


```abnf
rule = definition ; comment CR LF
```


ここで、rule は大文字小文字が区別される非終端記号、definition はその rule を定義する記号列、comment は文書化のためのコメントである。最後尾には必ず CR と LF による改行コードが付属する。

規則名は大文字小文字を区別しない。`<rulename>` も `<RULENAME>` も `<rUlENamE>` も同じ規則を参照している。規則名はいわゆるアルファベット文字で始まり、その後にアルファベット、数字、ハイフンが続く。

山括弧（`&lt;`と`&gt;`）は規則名を囲むのに必要とはされていない。しかし、規則名を識別しやすいように山括弧で囲むことが多い。

ABNF は 7ビットASCIIで符号化され、最上位の8ビット目はゼロに設定される。

## 終端記号の値

終端記号は1つ以上の文字コードで表される。

文字コードは、パーセント記号“`%`”とそれに続く基数を表す文字（b = 2進、d = 10進、x = 16進）、さらに値で示される。文字列は値を “`.`”で連結することで表される。例えば、復帰コードは `%d13` または `%x0D` で示される。復帰コードの後に改行コードが続く場合、連結を使って `%d13.10` などと表される。

リテラルテキストは引用符 (`"`) で囲まれた文字列を使って表される。これら文字列は大文字小文字が区別されず、文字セットとしては US-ASCII が使われる。従って、“abc”という文字列は、“abc”、“Abc”、“aBc”、“abC”、“ABc”、“AbC”、“aBC”、“ABC”とマッチする。大文字小文字を区別したい場合、文字コードを上述の記法で指定するかで導入された“%s”プレフィクスを使用するかする必要がある。“aBc”という大文字小文字の組合せを表したい場合、`%d97 %d66 %d99`あるいは`%s"aBc"` とする。

## オペレータ
### 空白
空白は定義内の各要素を区切るのに使われる。

### 連結
: `Rule1 Rule2`

規則名を並べることで規則が定義される。

“aba”にマッチする文字列を定義するには、次のような規則群を使用する。
# `fu = %x61	; a`
# `bar = %x62	; b`
# `mumble = fu bar fu`

### 択一
: `Rule1 / Rule2`

規則名を斜線 (“`/`”) で区切って並べることで選択肢型の規則が定義される。

規則  か、規則  のどちらでもよいという規則は次のように記述される。
: `fubar = fu / bar`

### 選択肢追加
: `Rule1 =/ Rule2`

規則名と定義の間に “`=/`” を置くことで規則に選択肢を追加できる。

: `ruleset = alt1 / alt2 / alt3 / alt4 / alt5`
という規則は次の規則群と等価である。
# `ruleset = alt1 / alt2`
# `ruleset =/ alt3`
# `ruleset =/ alt4 / alt5`

### 値の範囲指定
: `%c##-##`

数値範囲はハイフン (“`-`”) で指定される。

: `OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"`
という規則は、次の規則と等価である。
: `OCTAL = %x30-37`

### グループ化
: `(Rule1 Rule2)`

定義内で複数の要素を括弧でくくることにより、規則のグループ化がなされる。

“elem fubar snafu”または“elem tarfu snafu”にマッチする規則は次のようになる。
: `group = elem (fubar / tarfu) snafu`

“elem fubar”または“tarfu snafu”にマッチする規則は次のどちらでもよい。
* `group = elem fubar / tarfu snafu`
* `group = (elem fubar) / (tarfu snafu)`

### 変数の反復
: `n*nRule`

要素の繰り返しには `&lt;a&gt;*&lt;b&gt;element` という形式が使われる。`&lt;a&gt;` の部分はオプションで最小反復回数を示し、省略した場合 0 である。`&lt;b&gt;` の部分はオプションで最大反復回数を示し、省略した場合無限の反復となる。

`*element` は0回以上の任意回の反復、`1*element` は1回以上の任意回の反復、`2*3element` は2回か3回の反復を表す。

### 特定回数の反復
: `nRule`

反復回数を指定するには `&lt;a&gt;element` という形式を用いる。これは `&lt;a&gt;*&lt;a&gt;element` と等価である。

`2DIGIT` は2桁の数、`3DIGIT` は3桁の数を表す。DIGIT は後述する中核規則で定義されている。

### オプション
: `[Rule]`

オプション要素は次のいずれかで示すことができる。
* `[fubar snafu]`
* `*1(fubar snafu)`
* `0*1(fubar snafu)`

### コメント
: `; comment`

コメントはセミコロン (“`;`”) から行末までである。

### オペレータの優先順位
以上のオペレータの優先順位は次の通り（上にあるほど優先される）。
# 文字列、名前の形成
# コメント
# 値の範囲
# 反復
# グループ化、オプション
# 連結
# 択一

択一オペレータを連結と共に使うと解釈が混乱する可能性があるため、グループ化で優先順位を明示することが推奨される。

### 中核規則
ABNF には、以下の中核規則（core rules）が定義されている。

## 例
バッカス・ナウア記法 (BNF) のページにもあったアメリカ合衆国での住所表記の例を ABNF で表した例である。

```abnf
postal-address   = name-part street zip-part

name-part        = *(personal-part SP) last-name [SP suffix] CRLF
name-part        =/ personal-part CRLF

personal-part    = first-name / (initial ".")
first-name       = *ALPHA
initial          = ALPHA
last-name        = *ALPHA
suffix           = ("Jr." / "Sr." / 1*("I" / "V" / "X"))

street           = [apt SP] house-num SP street-name CRLF
apt              = 1*4DIGIT
house-num        = 1*8(DIGIT / ALPHA)
street-name      = 1*VCHAR

zip-part         = town-name "," SP state 1*2SP zip-code CRLF
town-name        = 1*(ALPHA / SP)
state            = 2ALPHA
zip-code         = 5DIGIT ["-" 4DIGIT]
```


## 参考文献
* 	Case-Sensitive String Support in ABNF
* 	Augmented BNF for Syntax Specifications: ABNF
* 	Augmented BNF for Syntax Specifications: ABNF (Obsolete)
* 	Augmented BNF for Syntax Specifications: ABNF (Obsolete)