3. Operators (演算子)
3.1. Concatenation: Rule1 Rule2 (連結)
ルールは、ルール名のシーケンスをリストすることにより、単純で順序付けられた値の文字列 (すなわち、連続した文字の連結) を定義できます。例えば:
foo = %x61 ; a
bar = %x62 ; b
mumble = foo bar foo
したがって、ルール <mumble> は小文字の文字列 "aba" にマッチします。
線形空白 (Linear White Space): 連結はABNF解析モデルの中核です。連続した文字 (値) の文字列は、ABNFで定義されたルールに従って解析されます。インターネット仕様では、区切り特殊文字やアトミック文字列などの主要な構成要素の周りに、線形空白 (スペースと水平タブ) を自由かつ暗黙的に散在させることを許可する歴史があります。
3.2. Alternatives: Rule1 / Rule2 (代替)
スラッシュ ("/") で区切られた要素は代替です。したがって:
foo / bar
は <foo> または <bar> を受け入れます。
3.3. Incremental Alternatives: Rule1 =/ Rule2 (増分代替)
代替のリストを断片的に指定すると便利な場合があります。つまり、初期ルールが1つ以上の代替にマッチし、後で追加の代替が定義されます。これは、パラメータリストでよく発生するように、同じ親ルールセットから派生した独立した仕様にとって特に有用です。ABNFは、次の構文を通じてこの増分定義を許可します:
oldrule =/ additional-alternatives
3.4. Value Range Alternatives: %c##-## (値範囲代替)
代替数値の範囲は、ダッシュ ("-") を使用して代替値の範囲を示すことにより、コンパクトに指定できます。したがって:
DIGIT = %x30-39
は次と同等です:
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
3.5. Sequence Group: (Rule1 Rule2) (シーケンスグループ)
括弧で囲まれた要素は、その内容が厳密に順序付けられた単一の要素として扱われます。したがって:
elem (foo / bar) blat
は (elem foo blat) または (elem bar blat) にマッチします。
elem foo / bar blat
は (elem foo) または (bar blat) にマッチします。
3.6. Variable Repetition: *Rule (可変繰り返し)
要素の前にある演算子 "*" は繰り返しを示します。完全な形式は:
<a>*<b>element
ここで、<a> と <b> はオプションの10進数値で、要素の少なくとも <a> 回、最大 <b> 回の出現を示します。
デフォルト値は0と無限大なので、*<element> は0を含む任意の数を許可します; 1*<element> は少なくとも1つを必要とします; 3*3<element> は正確に3つを許可します; 1*2<element> は1つまたは2つを許可します。
3.7. Specific Repetition: nRule (特定繰り返し)
次の形式のルール:
<n>element
は次と同等です:
<n>*<n>element
つまり、<element> の正確に <n> 回の出現です。したがって、2DIGIT は2桁の数字であり、3ALPHA は3つのアルファベット文字の文字列です。
3.8. Optional Sequence: [RULE] (オプションシーケンス)
角括弧はオプションの要素シーケンスを囲みます:
[foo bar]
は次と同等です:
*1(foo bar)
3.9. Comment: ; Comment (コメント)
セミコロンは、行末まで続くコメントを開始します。これは、仕様と並行して有用なノートを含める簡単な方法です。
3.10. Operator Precedence (演算子の優先順位)
上記で説明したさまざまなメカニズムには、最も高い (最も強く結合する) ものから最も低い (最も緩い) ものまで、次の優先順位があります:
- ルール名、散文値 (Prose-val)、終端値 (Terminal Value)
- コメント (Comment)
- 値範囲 (Value Range)
- 繰り返し (Repetition)
- グループ化 (Grouping)、オプション (Optional)
- 連結 (Concatenation)
- 代替 (Alternative)
代替演算子を連結と自由に混在させて使用すると、混乱を招く可能性があります。グループ化演算子を使用して、連結グループを明示的にすることが推奨されます。