ABNF
Augmented Backup-Naur form
RFC 5234, RFC 7405
それ自体でParserを書くというよりは人が読むことを前提にしているが、parseに使えないこともない
ルール
名前 = 式 改行
名前は大文字小文字を区別しない
基本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 # * を , で繋げる拡張
RFC 7230 HTTP/1.1 Section 7 ABNF リスト拡張: # rule
どちらも# でカンマ区切りを可能にする拡張
ABNF Parser
ABNFで正規表現Parserは書けそう
正規表現でABNF Parserは無理そう