ABNF(Augmented Backus-Naur Form)は、
[バッカス・ナウア記法]を拡張したもので、主に
通信プロトコルなどの形式体系を記述するために用いられる
メタ言語です。RFC 5234で標準化されており、IETF(
Internet Engineering Task Force)がプロトコルを定義する際によく利用されます。
ABNFの概要
ABNFは、生成規則の集合によって構成されます。各規則は、以下のような構造を持ちます。
abnf
rule = definition comment
- - rule: 規則の名前を表す非終端記号。大文字と小文字は区別されます。
- - definition: その規則の内容を定義する記号列。
- - comment: コメントとして記述されるテキストで、説明を補足するのに役立ちます。
規則名は、アルファベット文字で始まり、その後にはアルファベット、数字、ハイフンが続く形で構成されます。規則名を囲む山括弧 `<>` は必須ではありませんが、視認性を高めるために使用されることが一般的です。
ABNFは7ビットASCIIでエンコードされ、最上位の8ビットは常にゼロに設定されます。
終端記号の値
終端記号は、一つ以上の文字コードで表されます。文字コードは、パーセント記号 "%" に続けて基数(b: 2進数、d: 10進数、x: 16進数)と値を指定します。複数の値を連結するには、ドット"."を使用します。例えば、復帰コードは `%d13` や `%x0D` と記述できます。また、復帰と改行を連続して表す場合は `%d13.10` のように記述します。
リテラル文字列は、ダブルクォート `"` で囲んで表現します。これらの文字列は大文字と小文字を区別せず、US-ASCII文字セットが適用されます。例えば、`"abc"` は、`"abc"`、`"Abc"`、`"aBc"`、`"abC"`、`"ABc"`、`"AbC"`、`"aBC"`、`"ABC"` のいずれとも一致します。大文字と小文字を区別したい場合は、文字コードによる表現を使用するか、RFC 7405で導入された `%s` プレフィックスを使用します。例えば、`"aBc"` を明示的に表現する場合は、`%d97 %d66 %d99` または `%s"aBc"` と記述します。
ABNF のオペレータ
ABNFでは、さまざまなオペレータを使用して複雑な規則を記述できます。
空白
空白は定義内の要素を区切るために使用されます。
連結
規則を並べて記述することで、連結を表します。
abnf
fu = %x61 ; a
bar = %x62 ; b
mumble = fu bar fu ; "aba" に一致
択一
スラッシュ `/` で区切って記述することで、複数の選択肢を表します。
abnf
fubar = fu / bar ; fu または bar のどちらかに一致
選択肢の追加
`=/` を使用して、既存の規則に選択肢を追加できます。
abnf
ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5
この例では、 `ruleset` は `alt1`、`alt2`、`alt3`、`alt4`、`alt5` のいずれかに一致します。
値の範囲指定
`%c##-##` の形式で数値の範囲を指定できます。
abnf
OCTAL = %x30-37 ; 0 から 7 までの文字に一致
グループ化
括弧 `()` で要素をグループ化できます。
abnf
group = elem (fubar / tarfu) snafu ; "elem fubar snafu" または "elem tarfu snafu" に一致
変数の反復
`n
mRule` の形式で、要素の繰り返し回数を指定できます。
element`: 0回以上の繰り返し
- `1element`: 1回以上の繰り返し- `23element`: 2回または3回の繰り返し
特定回数の反復
`nRule` の形式で、特定回数の繰り返しを指定できます。これは `n
nRule` と同等です。
オプション
括弧 `[]` で囲むことで、オプションの要素を表します。
abnf
[fubar snafu] ; fubar snafu はオプション
コメント
セミコロン `;` から行末までがコメントです。
オペレータの優先順位
オペレータは以下の順で優先されます。
1. 文字列、名前形成
2. コメント
3. 値の範囲
4. 反復
5. グループ化、オプション
6. 連結
7. 択一
択一と連結を組み合わせる場合は、グループ化で優先順位を明確にすることを推奨します。
中核規則
ABNFには、基本的な規則がいくつか定義されています。これらは、他の規則を定義する際に使用されます。
ABNFの例
アメリカの住所表記の例を ABNF で表現すると以下のようになります。
abnf
address = name 1SP address-line
(CRLF address-line)
name = 1ALPHA
SP = %x20 ; space
address-line = number SP street
SP city-state-zip
number = 1DIGIT
street = 1
ALPHA
city-state-zip = 1ALPHA "," SP 1
ALPHA SP 1DIGIT
参考文献
- - RFC 7405 Case-Sensitive String Support in ABNF
- - RFC 5234 Augmented BNF for Syntax Specifications: ABNF
- - RFC 4234 Augmented BNF for Syntax Specifications: ABNF (Obsolete)
- - RFC 2234 Augmented BNF for Syntax Specifications: ABNF (Obsolete)
ABNFは、ネットワークプロトコルやデータ形式を正確に記述するための強力なツールです。この解説を通じて、ABNFの基本を理解し、より複雑な形式記述に応用できるようになることを願っています。