Augmented BNF for Syntax Specification: ABNF (RFC5234)

ABNFはあるモノのシンタックスを形式的に定義するための言語。
URIもABNFをもとに定義されている。(RFC3986)
但し、RFC3986が参照しているABNFはRFC2234によるもの。

Wikipediaによると、RFC5234はRFC4234をアップデートしたもの。
そして、RFC4234はRFC2234とRFC733をアップデートしたもの。

Terminal Values

文字ベースのものと数値表現ベースのものがある。

文字ベース

Rule1 = "a"
Rule2 = "ab"

文字ベースのルールは大文字・小文字を区別しない。
なので、Rule1は a、A にマッチし、Rule2は ab、aB、Ab、AB にマッチする。

数値表現ベース

Rule1 = %d13 ; 10進表現
Rule2 = %x61 ; 16進表現



ABNFで表現された文字列をコンピュータで扱う場合、最終的にはバイナリとして表現されるが、バイナリ表現は文字コードによって異なる。
RFC5234ではABNFの文字コードについて特に何も規定していない。
なので、<%x61>(%x61はasciiで"a"を表す)が<"a">にマッチするかどうかは想定する文字コードによって変わってくる。

演算子

Concatenation

Rule = Rule1 Rule2

という形で、2つの文字列の結合を表す。 例えば、

foo = %x61  ; a
bar = %x62  ; b
Rule = foo bar

では、<Rule>は aba とマッチする。

Alternative

Rule = Rule1 / Rule2

という形でORを表す。 例えば、

foo = %x61  ; a
bar = %x62  ; b
Rule = foo / bar

では、<Rule>は a と b にマッチする。

Value Range Alternative

例えば、以下で<DIGIT1>と<DIGIT2>は同じルールを表す。

DIGIT1 = %x30-%x39
DIGIT2 = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"

Square Group

演算子適用の優先順位を上げる。 例えば、

Rule = foo (bar / foo) foo  ; => (foo bar foo) / (foo foo foo)

Variable Repetition

Rule1 = <a>*<b>element
Rule2 = <a>*element
Rule3 = *<b>element
Rule4 = <a>element

と書き、ルール<element>の繰り返しを表す。
<Rule1>は<element>のa回以上b回以下の繰り返し。
<Rule2>は<element>のa回以上の繰り返し。
<Rule3>は<element>の0回以上b回以下の繰り返し。
<Rule4>は<element>のa回の繰り返し。
例えば、

Rule1 = 1*3foo  ; => foo / (foo foo) / (foo foo foo)
Rule2 = 2*foo   ; => (foo foo) / (foo foo foo) / ....
Rule3 = *2foo   ; => "" / foo / (foo foo)
Rule3 = 3foo    ; => foo foo foo

Optional Sequence

Rule = [Rule1]

例えば、

Rule = foo [bar] foo ; => (foo bar foo) / (foo foo)

演算子の優先順位

Value range > Repetition > Grouping > Concatenation > Alternative