メインコンテンツまでスキップ

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)

付録 (Appendices)


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"]
繰り返し*Rule0回以上*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"

数値 (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 の比較

特徴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仕様を読み、実装するために非常に重要です!