-
-
Notifications
You must be signed in to change notification settings - Fork 1
Home
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);
のように指定できます。