ABNF
Augmented Backup-Naur form
RFC 5234, RFC 7405
RFC などでよく使われているメタ言語 BNFの一種
それ自体でParserを書くというよりは人が読むことを前提にしているが、parseに使えないこともない
JSONのJSON Schemaのようなものをテキストをベースにしたものかもしれず
mailのRFC 822などがベースになっている
ルール
名前 = 式 改行
名前は大文字小文字を区別しない
基本1行 "\" かなにかで折り返し可能
式に一致すると有効、一致しないと無効的な判定をしていく
結合 concat
ルールをスペースで区切ってつなげることで 文字列と同じく結合される
"abc" "def" は "abcdef" 的なところ
選択 / or
"abc" / "def"
どちらかに一致する
名前 name = value で名前をつけることができる
abc = "ABC"
前方、後方参照可能なのでループした定義も可能
1つの定義内で重複した名前は不可かもしれない
処理系では名前をつけた部分を抽出できると便利
* 繰り返し
<a>*<b>value
最低a回、最大b回value を繰り返したものにマッチする
a 省略時0
b 省略時∞
例 1*5number *number
省略 四角括弧 []の半角のもの
[value]でvalue または value を省略したものと一致する
0*1value とおなじ
(ぐるーぷ)
括弧でグループとしてまとめることができる
1*4("abc" "def")
<注釈>
ABNFとして書きにくいところを言葉で説明した箇所
あとの細かいところは判定順序くらいかな
RFC 5234 のABNFを読むと優先順位もわかるかも
ABNFはABNFで定義されているのでABNFで書けば動く
RFC 7405 は 大文字小文字の判別を可能にした拡張
HTML用のABNFでも一部拡張されている
# 特殊用途 list 拡張
RFC 822 Internet Message Section 2.7 # * を , で繋げる拡張
RFC 7230 HTTP/1.1 Section 7 ABNF リスト拡張: # rule
どちらも# でカンマ区切りを可能にする拡張
RFC 822 2.7 #RULE: LISTS
スペースは考慮されていない、後継の RFC 2822 では使われていない
構文「#」は「*」と同様に、以下のように定義されます。
code:RFC 822 2.7 lists
<l>#<m>element
<l>#<m>要素
は、少なくとも<l>個、最大<m>個の要素を1つ以上のカンマ(",")で区切って表します。これにより、通常のリスト形式が非常に簡単になります。「(要素 *("," 要素))」のような規則は、「1#要素」と表記できます。この構文が使用される箇所では、null要素は許容されますが、要素数には含まれません。つまり、「(要素),,(要素)」は許容されますが、要素数は2つとカウントされます。したがって、少なくとも1つの要素が必要な場合は、null以外の要素が少なくとも1つ存在する必要があります。デフォルト値は0と無限大です。つまり、「#(要素)」は0を含む任意の数の要素を許容し、「1#要素」は少なくとも1つの要素を許容し、「1#要素」は1つまたは2つの要素を許容します。
0 から 無限大の要素数に対応する
code:仮
1#element => element *("," element)
RFC 7230 Section 7 ABNF List拡張: #rule
正規の構文と互換性を考慮した構文拡張がある
code:RFC 7230 ABNF list element
1#element => element *( OWS "," OWS element )
#element => 1#element
n >= 1 and m > 1 の場合
<n>#<m>element => element <n-1>*<m-1>( OWS "," OWS elemet )
code:互換
#element => [ ( "," / element ) *( OWS "," OWS element ) ]
1#element => *( "," OWS ) element *( OWS "," OWS element )
ABNF Parser
https://siisise.net/abnf.html GitHub SoftLibABNF
ABNFで正規表現Parserは書けそう
正規表現でABNF Parserは無理そう