Skip to content
SATO Masatoshi edited this page Mar 14, 2023 · 1 revision

Welcome to the SoftLibABNF wiki!

JavaでABNFを使うためのいろいろです。

前提

処理するのはバイト列(byte[])ですが、入れ物にnet.siisise.io.Packet 型, net.siisise.io.ReadableBlock 型を使っています。 データ列、Streamなどとして扱うためのclassです。

定義 ABNF 名前空間 ABNFReg

この2つのclassが扱えればなんとかなります。 staticで定義してしまうのが使いやすいのかも。

定義

static ABNFReg REG = new ABNFReg();

static ABNF ALPHA = REG.rule("ALPHA","%x41-5A / %x61-7A");

定義はstatic ABNF ALPHAのようにJavaで持っていてもいいし、REG.ref("ALPHA") のようにREGから取り出して使ってもよい。

一致

boolean b = ALPHA.is(src);

先頭が一致すれば true, 一致しなければ false の単純な判定です。srcがPacketの場合は一致したところがsrcから読まれて消えます。

boolean b = ALPHA.eq(src);

この場合全体が一致すればtrue, 一致しなければfalseです。

検索

ABNF sub1, sub2;

ABNF.Match m = ALPHA.find(src,sub1,sub2);

srcの先頭からALPHAに一致するものを抽出します。一致しなければnullです。 ALPHAにsub要素はありませんが、ALPHAのなかでsub1, sub2 に一致するものがあればその部分も抽出します。 結果は基本的にPacketかReadableBlock型でMatchに格納されています。

ABNFの定義にParserを埋め込むことで、一致した部分を特定のclassに変換して渡すこともできます。

static ABNF OOO = REG.rule(name, parserClass, pattern);

のように指定できます。

Clone this wiki locally