2007年4月17日火曜日

バッカス・ナウア記法(BNF)の読み方

BNF(Backus-Naur Form)は、プログラミング言語やプロトコルフォーマットの構文記述に用いられるメタ言語である。RFCでもABNF(Augmented Backus-Naur Form)と呼ばれる拡張BNFが用いられているため、RFC読解には理解する必要がある。

以下にABNFを中心として、BNFの概要をまとめた。

●BNF(バッカス・ナウア記法)


BNFはプログラミング言語「ALGOL60」の構文定義を行うために考案されたメタ言語である。John Backus氏が提案して、Peter Naur氏により修正された言語であるため、両氏の名前を冠し、Backus-Naur Form(バッカス・ナウア形式)と呼ばれている。

BNFは、拡張性に富み、簡易であるという理由から、拡張が行われ、ISO、IETF等の標準仕様においてプロトコルのフォーマット記述に用いられるようになった。BNFは拡張が容易であることから、独自にさまざまな拡張が行われることになった。ISO、IETFではそれぞれ、EBNF、ABNFと呼ばれるBNF拡張体系が標準化されている。

●ABNF(Augmented BNF for Syntax Specification)

IETFの仕様書で使われている拡張BNF。初期のRFCでは、RFCの中で使うBNFの拡張内容をそのRFCの中で記述するということが行われていたが、1997年11月にRFC2234(Augmented BNF for Syntax Specifications: ABNF)が制定され、RFCで利用するABNFの標準が規定された。その後、2005年10月にABNFの標準仕様の改版が行われている。改版された仕様書はRFC4234として発行されている。

●SIPのBNF

RFC3261(Session Initiation Protocol)をはじめとしたIETFのSIP仕様でも、プロトコルフォーマットの記述にABNFが用いられている。RFC3261は、RFC2234のABNFが用いられている。RFC3261は2002年6月に制定されており、RFC4234の発行前の制定であるため。

以下にABNFの文法について、SIPのABNFを例にひきながら解説する。解説は特に注釈のない限り、ABNFの標準仕様の最新版であるRFC4234に基づいて行う。

●ABNFの全体像

RFC4234に規定されるABNFの規定は、大きく「規則定義」「演算子」「ABNFコア規則」の3つの部分に分けられる。「規則定義」は、規則を記述する基本的な書式、規則名の命名規則、終端値という概念、拡張エンコーディングについて規定している。「演算子」では、並列、選択、追加、範囲指定、グループ指定、繰り返し指定、オプション指定、コメント記述方法について規定している。「ABNFコア規則」では、「SP(スペース)」「ALPHA(アルファベット)」「DIGIT(数字)」などの規則が定義されている。

以下にそれぞれの規則の概要を説明していく。

●規則定義

1.基本的な書式

ABNFは、以下の書式で記述する。

    <規則名> = <仕様>

nameという規則名は、"Hitokuchi"という文字列であると定義する場合には、下記のように記述する。なお、""の中に記載された英文字は大文字と小文字を区別しないので、"hiToKuChi"なども、nameに含まれる。

    name = "Hitokuchi"

さらに仕様の中に、別の規則名を記述することもできる。

2.規則名の命名規則(作成中)
3.終端値
(作成中)
4.拡張エンコーディング
(作成中)

●演算子

並列、選択、追加、範囲指定、グループ指定、繰り返し指定、オプション指定、コメント記述方法という8つの演算子が定義されている。

1.並列(作成中)
2.選択
(作成中)
3.追加
(作成中)
4.範囲指定
(作成中)
5.グループ指定
(作成中)

6. 繰返し指定(Repetition)

同じ表現を複数繰り返す場合には、仕様の前に数字を付ける。

      7DIGIT        ; 7桁の数字
  1*3DIGIT    ; 1桁~3桁の数字列
  2*ALPHA    ; 2文字以上の英文字
  *5SP             ; 0~5つ以内のスペース
      *DIGIT       ; 0桁以上の数字

RFC3261に記載されているIPv4アドレスの形式を以下に示す。
このABNFは、IPv4Addressは、1桁から3桁の数字列4つを、"."(ピリオド)で結んだ形であるということを示している。

  IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT

7. オプション指定(Optional Sequence)

オプションの要素を表現する場合には、[]で囲む。

下記は、RFC3261に記載される、Request要素の例である。Requestには、Request-Lineと0個以上のメッセージヘッダ(message-header)と改行文字(CRLF)が含まれるが、メッセージボディ(message-body)は任意であり、あってもなくてもよい。

    Request = Request-Line
                       *( message-header )
                       CRLF
                       [ message-body ]

8. コメント記述方法(作成中)

●ABNFコア規則(CORE ABNF)

RFC4234 Appendix B. の CORE ABNF のうち RFC3261 で使われているものを以下に抜粋した。

  ALPHA = %x41-5A / %x61-7A ; A-Z / a-z、英文字を示す
  CRLF = CR LF ; 改行文字
  CR = %x0D ; cariiage retuan
  LF = %x0A ; linefeed
  WSP = SP / HTAB ; スペースか、水平タブ
  SP = %x20 ; スペース
  HTAB = %x09 ; 水平タブ
  DIGIT = %x30-39 ; 0-9の数字を示す

(以下作成中)


1 件のコメント:

匿名 さんのコメント...

こんにちは
こちらにSIPサーバについてのホワイトペーパーがありますので、どうぞご覧ください。
http://www.radvision.com/Resources/WhitePapers/b2bua.htm