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)
インターネット技術仕様では、形式的な構文 (Syntax) を定義する必要があることがよくあります。長年にわたり、バッカス・ナウア記法 (BNF, Backus-Naur Form) の修正版である拡張BNF (ABNF, Augmented BNF) が、多くのインターネット仕様で人気を博してきました。本仕様はABNFを文書化します。これは、コンパクト性とシンプル性を、合理的な表現力とバランスさせています。標準BNFとABNFの違いは、命名規則 (Naming Rules)、繰り返し (Repetition)、代替 (Alternatives)、順序独立性 (Order-Independence)、および値範囲 (Value Ranges) に関わります。本仕様はまた、いくつかのインターネット仕様に共通するコア字句解析器 (Core Lexical Analyzer) のタイプに対する追加のルール定義とエンコーディングを提供します。
本メモのステータス (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) は、構文を定義するために使用されるメタ言語 (Metalanguage) であり、インターネットプロトコル仕様で広く使用されています。これは、古典的なバッカス・ナウア記法 (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] | 0回または1回 | ["s"] |
| 繰り返し | *Rule | 0回以上 | *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"
数値 (16進数)
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仕様を読み、実装するために非常に重要です!