2. 表記上の慣習と一般的な文法

2.1 拡張BNF(Backus-Naur Form)記法

 本プロトコルの内容は、拡張BNF記法を用いて記述されている。拡張BNF記法は、以下のような構造を持っている。

        name = definition

 ルールの名前(name)は、単に名前そのもので("<"や">"では囲まない)、その定義(definition)とは「=」で区切られる。スペースは、継続行のインデントが1行以上にわたるルールの定義を示すために使われる場合にのみ意味を持つ。いくつかの基本的なルールは、SP、TAB、CRCF、DIGIT、ALPHAなどの大文字で表現されている。角括弧("<"や">")は、その存在がルール名の使用を識別するのに役立つ場合には、定義の中で使用される。


        "literal"

 引用符で囲まれたテキストはリテラルテキストを意味する。特に記述されていなければ、テキストは大文字、小文字の区別をしない。


        rule1 | rule2

 ("|")をはさむ要素は、選択可能なものである。例えば、"yes | no"は、yesとnoのどちらでもよいということを意味する。


        (rule1 rule2)

 括弧で囲まれた要素は、単一の要素として扱われる。即ち、"(elem (foo | bar) elem)"は、"elem foo elem"と"elem bar elem"というトークンの列を表現する。


        *rule

 "*"という文字は、繰り返しの要素の前に置かれる。上記の例の完全な表現形式は、"<n>*<m>element"で、最低<n>回と最大でも<m>回要素が出現することを示す。デフォルトの値は、0と無限であり、"*(element)"は、0も含めていかなる数の要素にも対応する。"1*element"は少なくとも1個の要素に対応し、"1*2element"は1つまたは2つの要素に対応する。


        [rule]

 箱括弧は、オプションの要素を示す。"[foo bar]"は、"*1(foo bar)"と同じである。


        N rule

 "<n>(element)"は繰り返しの特殊な形態であり、"<n>*<n>(element)"と同じである。これは、(element)が<n>回出現することを表す。2DIGITは、2桁の数字であり、3ALPHAは3つのアルファベット文字列である。


        #rule

 構造子"#"は、"*"と似た意味を持ち、要素のリストを定義するために定義されている。完全な表現形式は、"<N>#<M>ELEMENT"であり、1つ以上の(",")で区切られた少なくとも<N>最大でも<M>の要素を表す。区切りには、いくつかのスペースの列(LWS)が加わってもよい。この記法は、リストの通常の表現形態を非常に簡単にする。例えば、 "( *LWS ELEMENT *( *LWS "," *LWS ELEMENT ))"のようなルールは、"1#ELEMENT"として示すことができる。この構造子が使われる場合には、ヌル要素が許容されている。しかし、存在する要素の個数には数えられない。例えば、"(ELEMENT), , (ELEMENT)"は許されているが、2つの要素としてしか数えられない。このため、少なくとも1つの要素が要求されている場合には、最低1つのヌルでない要素が存在しなければならない。デフォルトの値は、0と無限であり、"#(ELEMENT)"は0を含めて如何なる数の要素のリストにもなりえる。"1#ELEMENT"は、少なくとも1つ以上の要素を表現し、"1#2ELEMENT"は1または2の要素を表現する。


        ; comment

 ルールテキストの右側に置かれたセミコロンは、それ以降から行末までがコメントであることを示す。これは、仕様の規定に対して有用な注釈をつけるための簡便な方法である。

2.2 基本ルール

 基本的な構文構造を記述するために、この仕様書では以下のようなルールが使用されている。
        OCTET   =       <すべての8ビット文字>
        CHAR    =       <すべてのASCII文字(octets 0 - 127)>
        UPALPHA =       <すべてのASCIIの大文字(AからZまで)>
        LOALPHA =       <すべてのASCIIの小文字("a"から"z"まで)>
        ALPHA   =       UPALPHA | LOALPHA
        DIGIT   =       <すべてのASCII数字("0"から"9"まで)>
        CTL     =       <すべてのASCIIコントロール文字(octets 0 - 31)及びDEL(127)>
        CR      =       <ASCII CR, キャリッジリターン(13)>
        LF      =       <ASCII LF, ラインフィード(10)>
        SP      =       <ASCII SP, スペース(32)>
        HTAB    =       <ASCII HT, タブ(9)>
        <">     =       <ASCII ダブルクオータ>
        CRLF    =       LF (HTTP通信の場合)
                =       CR LF (HTTPS通信の場合)

 本プロトコルのヘッダーを複数の行に分割する場合には、継続行はスペースの並びで始まるようにしなければならない。連続したスペースは、意味的にはSPと同じ(改行による折り返しも含めて)である。

        LWS            =        [CRLF] ( SP | HTAB )

 多くの本プロトコルのヘッダーフィールドの値は、LWSまたは特殊文字により区切られる。これらの特殊文字をパラメーターの値として使用する場合には、引用符つきの文字列に入れておかなくてはならない。

        word      =     token | quoted-string
        token     =     1*<CTLsまたはtspecialsを除くすべてのCHAR>
        tspecials =     "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" |
                        <"> | "/" | "[" | "]" | "?" | "=" | SP | HTAB

 テキストの文字列は、ダブルクオータまたは角括弧を用いて引用されている場合には、1つの単語として取り扱われる。

        quoted-string   =    ( <"> *(qdtext) <"> ) | ( "<" *(qatext) ">" )
        qdtext          =    <<">とCTLsを除くすべてのCHAR、ただしLWSは含めるものとする>
        qatext          =    <"<"、 ">"とCTLsを除く,すべてのCHAR、ただしLWSは含めるものとする>

 以下のテキストルールは、記述的なフィールド内容に対してのみ用いられる。

        text    =       <CTLsを除くすべてのOCTET、ただしLWSは含めるものとする>