コンピュータサイエンスにおいて、拡張バッカス・ナウア記法(ABNF)は、バッカス・ナウア記法(BNF)に基づくメタ言語ですが、独自の構文と導出規則から構成されています。ABNFの動機は、通信プロトコルのペイロードオブジェクトとプロトコルユニットのフォーマットを定義するための使いやすいツールを定義することです。これは、 2010年12月現在、インターネット標準68(「STD 68」、タイプケースsic)で定義されています。 これはRFC 5234であり、IETF通信プロトコルの定義言語としてよく用いられます。[ 1 ] [ 2 ]
RFC 5234 はRFC 4234、2234 、および733に取って代わるものです。[ 3 ] RFC 7405はそれを更新し、大文字小文字を区別する文字列リテラルを指定する構文を追加します。
ABNF仕様は、次のように記述される導出規則のセットです。
ルール=定義; コメント CR LFここで、rule は大文字小文字を区別しない非終端記号であり、定義は、ルールを定義する記号のシーケンス、ドキュメント用のコメント、およびキャリッジリターンとラインフィードで終わる。
ルール名は大文字と小文字を区別しません。<rulename>、<Rulename>、<RULENAME>、 は<rUlENamE>すべて同じルールを指します。ルール名は、文字の後に文字、数字、ハイフンが続く形式です。
規則名を囲むのに山括弧(<, >)は必須ではありません(BNFでは必須です)。ただし、文章中で規則名を識別するために使用する場合は、山括弧を使用して規則名を区切ることができます。
終端記号はABNFにおける基本的な構成要素です。非終端記号はこれらの基本構成要素の上に構築されます。非終端記号は、文字のシーケンスを指定し、それらのシーケンスが文字通り一致します。(厳密には、ABNFにおける実際の終端記号は個々の文字(ABNFでは非負の整数に過ぎない)ですが、記述の容易さのために、構文が拡張され、文字のシーケンスの一致も可能になっています。)
終端値は数値で指定できます。この場合、文字コードまたはコードのシーケンスに対応します。このような値は、パーセント記号%、基数 ( b= 2 進数、d= 10 進数、x= 16 進数)、値、または値の連結 ( で示される.) の順に指定されます。たとえば、キャリッジリターンは、%d1310 進数では 、%x0D16 進数では で指定されます。キャリッジリターンに続くラインフィードは、 のように連結して指定できます%d13.10。
リテラルテキストは、引用符 ( ) で囲まれた文字列を使用して指定されます"。これらの文字列は大文字小文字を区別せず、使用される文字セットは (US-) ASCIIです。したがって、文字列は"abc""abc", "Abc", "aBc", "abC", "ABc", "AbC", "aBC", "ABC" に一致します。RFC 7405 では、大文字小文字を区別する文字列の構文が追加されました。 は%s"aBc""aBc" にのみ一致します。それ以前は、大文字小文字を区別する文字列は、個々の文字を列挙することによってのみ指定できました。 "aBc" に一致させるには、定義は となります。文字列は、プレフィックス を%d97.66.99使用することで、明示的に大文字小文字を区別しないように指定することもできます。%i
もう一つの構成要素値として、「prose-val」と呼ばれる括弧で囲まれた文字列があり、これは自然言語の散文において規則がどのようなものに一致するべきかを記述するものです。しかし、prose-valを用いたABNF文法は、人間の介入なしには構文解析プログラムに自動的に実装できないため、一般的には最終手段としてのみ使用されます。
空白文字は定義の要素を区切るために使用されます。区切り文字として認識されるには、空白文字を明示的に含める必要があります。単一の空白文字の明示的な参照はWSP(線形空白)であり、 LWSP0 個以上の空白文字と改行が許可されている場合は となります。
定義は左揃えです。読みやすさを考慮して複数行にわたる場合は、続きの行は空白でインデントされます。
; comment
セミコロン(;)は、行末まで続くコメントの開始を示します。
Rule1 Rule2
ルールは、一連のルール名を列挙することによって定義できます。
文字列「aba」に一致させるには、以下のルールを使用できます。
fu=%x61; abar=%x62; bmumble=fubarfuRule1 / Rule2
ルールは、スラッシュ( )で区切られた代替ルールのリストによって定義できます/。
ルールfuまたはルールbarを受け入れるために、次のルールを構築できます。
fubar=fu/barRule1 =/ Rule2
=/ルール名と定義の間にを使用することで、ルールに追加の選択肢を追加できます。
ルール
ruleset=alt1/alt2ruleset=/alt3ruleset=/alt4/alt5したがって、
ruleset=alt1/alt2/alt3/alt4/alt5%c##-##
数値の範囲はハイフン(-)を使用して指定できます。
ルール
OCTAL=%x30-37と同等
OCTAL="0"/"1"/"2"/"3"/"4"/"5"/"6"/"7"(Rule1 Rule2)
定義の中でルールをグループ化するために、要素を括弧で囲むことができます。
「ab d」または「ac d」に一致させるには、次のルールを構築できます。
group=a(b/c)d「ab」または「cd」に一致させるには、以下のルールを構築できます。
group=ab/cdgroup=(ab)/(cd)n*nRule
要素の繰り返しを示すには、この形式を使用します。オプションの は、含める要素の最小数を指定します(デフォルト値は 0)。オプションの は、含める要素の最大数を指定します(デフォルト値は無限大)。<a>*<b>element<a><b>
*element0 個以上の要素、*1element0 個または 1 個の要素、1*element1 個以上の要素、および2*3element2 個または 3 個の要素に使用します。正規表現e*、、e?およびe+を参照してくださいe{2,3}。
nRule
要素数を明示的に示すには、 の形式が使用され、 と同等です。<a>element<a>*<a>element
2DIGIT2桁の数字を取得するには を使用し、 3DIGIT3桁の数字を取得するには を使用します。(DIGITは下記の「基本ルール」で定義されています。また、下記の例の郵便番号も参照してください。)
[Rule]
オプション要素を示す場合、以下の構文は同等です。
[fubarsnafu]*1(fubarsnafu)0*1(fubarsnafu)以下の演算子は、最も強い結合から最も弱い結合の順に、以下の優先順位を持ちます。
連結に代替演算子を使用すると混乱を招く可能性があるため、連結グループを明示的に作成するためにグループ化を使用することをお勧めします。
コアルールはABNF標準で定義されています。これらは、一般的に使用される構成要素の定義を提供します。コアルールの正確な内容は使用するコードページによって異なりますが、インターネットの共通ベースラインである7ビットASCII(またはその上位セット)の場合、次のように定義されます。
ABNF言語は、1977年に制定されたARPAネットワークテキストメッセージ(初期の電子メールの一種)の標準規格であるRFC 733に由来する。RFC 733では、メールヘッダーの区切り文字として「線形空白」が定義されていた。
linear-white-space = 1* ([ CRLF ] LWSP - char ) ; 最新の LWSP と同様LWSP - char = SPACE / HTAB ; 最新の WSP と同等ABNF 言語は、 1997 年のRFC 2234で電子メールとは独立して記述されました。この文書には、最小繰り返しを指定する部分がない、現代形式の「LWSP」ルールが含まれていました。論理的に言えば、2 つのフィールド間の区切り文字を形成するには少なくとも 1 つの空白文字が必要なので、これは非常に珍しいことです。この違いは、2012 年の RFC Erratum 3096 (この構造を継承した RFC 5234 用に提出) で指摘されましたが、その時点では、他の標準がすでに独自の目的でこのルールを使用していたため、定義を変更するには遅すぎました。[ 4 ] 1LWSP
2008年のRFC 5234では、LWSPの定義に関連して、電子メール標準からの逸脱について次のような警告が追加されています。
この行間空白ルールを使用すると、メールヘッダーではもはや認められていない空白のみの行が許可され、他のコンテキストでは相互運用性の問題を引き起こしています。メールヘッダーを定義する際には使用しないでください。また、他のコンテキストで使用する場合は注意が必要です。
現代の電子メール標準であるRFC 5322(2008年)では、「線形空白」という用語も、定義済みのLWSP値も使用していません。代わりに、折りたたみ空白(FWS)を使用しています。
FWS = ([ * WSP CRLF ] 1* WSP ) / obs-FWS ; 折り畳み空白obs-FWS = 1* WSP * ( CRLF 1* WSP ) ; 廃止された折り畳み空白; 同等: LWSP-char [linear-white-space] (RFC 733 ルール) ; 同等: WSP LWSP (最新のコアルール)拡張バッカス・ナウア記法(ABNF)のページに示されている(米国の)郵便住所の例は、次のように指定できます。
郵便番号=名前部分通り名部分郵便番号部分名前部分= * (個人部分SP )姓[ SP接尾辞] CRLF名前部分=/個人部分CRLF個人部分=名/ (イニシャル"." )名= * ALPHAイニシャル= ALPHA姓= * ALPHA接尾辞= ( "Jr." / "Sr." / 1* ( "I" / "V" / "X" ))street = [ apt SP ] house-num SP street-name CRLF apt = 1*4 DIGIT house-num = 1*8 ( DIGIT / ALPHA ) street-name = 1* VCHARzip-part =町名"," SP州1*2 SP郵便番号CRLF町名= 1* ( ALPHA / SP )州= 2 ALPHA郵便番号= 5桁[ "-" 4桁]ABNFの構文自体は、以下のようなABNFで表現できます。
ルールリスト= 1 * (ルール/ ( * WSP c-nl ) )ルール=ルール名要素c-nlとして定義; 次の行が空白で始まる場合は継続 ;ルール名= ALPHA * ( ALPHA / DIGIT / "-" )defined-as = * c-wsp ( "=" / "=/" ) * c-wsp ; 基本ルール定義および; 段階的な代替案要素=交代* WSPc-wsp = WSP / ( c-nl WSP )c-nl =コメント/ CRLF ; コメントまたは改行コメント= ";" * ( WSP / VCHAR ) CRLF交替=連結* ( * c-wsp "/" * c-wsp連結)連結=繰り返し* ( 1 * c-wsp繰り返し)繰り返し= [繰り返し]要素repeat = 1* DIGIT / ( * DIGIT "*" * DIGIT )要素=ルール名/グループ/オプション/文字値/数値値/散文値グループ= "(" * c-wsp交代* c-wsp ")"オプション= "[" * c-wsp代替* c-wsp "]"char-val = DQUOTE * ( %x20-21 / %x23-7E ) DQUOTE ; SP と VCHAR の引用符付き文字列; DQUOTE なしnum-val = "%" ( bin-val / dec-val / hex-val )bin-val = "b" 1* BIT [ 1* ( "." 1* BIT ) / ( "-" 1* BIT ) ] ; 連結されたビット値の系列; または単一の ONEOF 範囲dec-val = "d" 1* DIGIT [ 1* ( "." 1* DIGIT ) / ( "-" 1* DIGIT ) ]hex-val = "x" 1* HEXDIG [ 1* ( "." 1* HEXDIG ) / ( "-" 1* HEXDIG ) ]prose-val = "<" * ( %x20-3D / %x3F-7E ) ">" ; SPとVCHARの括弧付き文字列; 山括弧なし;最後の手段として使用される散文の説明;