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

3. 演算子

3.1. 連接 (Concatenation): Rule1 Rule2​

規則は、規則名の並びを列挙することにより、単純な順序付けられた値の文字列 (すなわち、連続する文字の連接 (concatenation)) を定義できます。例えば、次のようになります。

      foo         =  %x61           ; a

bar = %x62 ; b

mumble = foo bar foo

これにより、規則 は小文字の文字列 "aba" に一致します。

線形空白 (linear white space): 連接は ABNF 解析モデルの中核です。連続する文字 (値) の文字列は、ABNF で定義された規則に従って解析されます。インターネット仕様では、特殊文字や原子的な文字列の区切りなど主要な構成要素の周囲に、線形空白 (空白および水平タブ) を自由かつ暗黙的に散在させることを認めてきた歴史があります。

NOTE:

本 ABNF 仕様は、線形空白の暗黙的な指定を提供していません。

区切り文字や文字列セグメントの周囲に線形空白を認めようとする文法は、それを明示的に指定しなければなりません。そのような空白を、高水準の規則の間でさまざまに使用される "コア" 規則で提供すると便利なことがよくあります。"コア" 規則は字句解析器 (lexical analyzer) にまとめてもよく、単にメインの規則集合の一部であってもかまいません。

3.2. 選択肢 (Alternatives): Rule1 / Rule2​

前方スラッシュ ("/") で区切られた要素は選択肢 (alternatives) です。したがって、foo / bar

は または を受け入れます。

NOTE:

英字を含む引用文字列は、代替文字を指定するための特別な形式であり、含まれる文字を、指定された順序で、ただし大文字と小文字を任意に混在させた組み合わせ文字列の集合を表す非終端記号 (non-terminal) として解釈されます。

3.3. 増分選択肢 (Incremental Alternatives): Rule1 =/ Rule2​

選択肢のリストを断片的に指定すると便利なことがあります。すなわち、最初の規則が 1 つ以上の選択肢に一致し、後続の規則定義がその選択肢の集合に追加する場合です。これは、同じ親規則集合 (parent ruleset) から派生する、それ以外の点では独立した仕様 (パラメータリストでよく起こります) に特に有用です。ABNF は、この増分的な定義を次の構文で認めています。

      oldrule     =/ additional-alternatives

したがって、規則集合

      ruleset     =  alt1 / alt2

ruleset =/ alt3

ruleset =/ alt4 / alt5

は、次の指定と同じです。

      ruleset     =  alt1 / alt2 / alt3 / alt4 / alt5

3.4. 値域の選択肢 (Value Range Alternatives): %c##-##​

代替的な数値の範囲は、代替値の範囲を示すダッシュ ("-") を用いて簡潔に指定できます。したがって、次のようになります。

      DIGIT       =  %x30-39

は次と等価です。

      DIGIT       =  "0" / "1" / "2" / "3" / "4" / "5" / "6" /
                 "7" / "8" / "9"

連結された数値と数値の範囲は、同じ文字列内では指定できません。数値は、連結のためにドット表記を使用することも、1 つの値域を指定するためにダッシュ表記を使用することもできます。したがって、行末の並びの間に 1 つの印字可能文字を指定するには、次のように指定できます。

      char-line = %x0D.0A %x20-7E %x0D.0A

3.5. シーケンスグループ (Sequence Group): (Rule1 Rule2)​

括弧で囲まれた要素は、その内容が厳密に順序付けられた単一の要素として扱われます。したがって、elem (foo / bar) blat

は (elem foo blat) または (elem bar blat) に一致し、elem foo / bar blat

は (elem foo) または (bar blat) に一致します。

NOTE:

選択肢が複数の規則名またはリテラルからなる場合は、"裸の" 選択 (alternation) を正しく読むことに頼るのではなく、グループ化表記を使用することが強く推奨されます。

したがって、次の形式を使用することが推奨されます。

 (elem foo) / (bar blat)

これは、不注意な読者による誤解を避けます。

シーケンスグループ表記は、自由文 (free text) において、文章から要素の並びを切り離すためにも使用されます。

3.6. 可変繰り返し (Variable Repetition): *Rule​

要素の前に置かれる演算子 "*" は繰り返し (repetition) を示します。完全な形式は次のとおりです。

  <a>*<b>element

ここで と は省略可能な 10 進値であり、要素の少なくとも 回、多くとも 回の出現を示します。

既定値は 0 と無限大であるため、 は 0 を含む任意の数を許容し、1 は少なくとも 1 回を要求し、33 はちょうど 3 回を許容し、12 は 1 回または 2 回を許容します。

3.7. 特定の繰り返し (Specific Repetition): nRule​

次の形式の規則は、element

次と等価です。

  <n>*<n>element

すなわち、 のちょうど 回の出現です。したがって、2DIGIT は 2 桁の数であり、3ALPHA は 3 つの英字からなる文字列です。

3.8. 省略可能な並び (Optional Sequence): [RULE]​

角括弧は省略可能な要素の並びを囲みます。

  [foo bar]

は次と等価です。

  *1(foo bar).

3.9. コメント (Comment): ; Comment​

セミコロンは、行末まで続くコメントを開始します。これは、仕様と並行して有用な注記を含めるための簡単な方法です。

3.10. 演算子の優先順位 (Operator Precedence)​

上記で説明した各種の機構には、最上位の最高 (最も強く結合する) から最下位の最低 (最も緩く結合する) までの優先順位があります。

規則名、prose-val, 終端値

コメント

値域

繰り返し

グループ化、省略可能

連接

選択肢

自由に連接と混在させた選択肢演算子の使用は、混乱を招くことがあります。

繰り返しますが、連接のグループを明示するためにグループ化演算子を使用することが推奨されます。