文法を型で定義 その2

以前, 構文解析器の話で,型を定義しながら文法も定義する的な話をしていたが,似たようなものがあった.

Pattern matching and parsing: binpac: a yacc for writing application protocol parsers, Ruoming Pang, Vern Paxson, Robin Sommer, Larry Peterson October 2006 Proceedings of the 6th ACM SIGCOMM on Internet measurement IMC '06

ネットワークプロトコルの解析言語らしい.たとえば,HTTPのレスポンスコード

HTTP/1.1 200 OK

みたいなのを文法(および型)で定義するとこうなる.

 type HTTP_ReplyLine = record { 
   version: HTTP_Version;
   : HTTP_WS;   // 注:WS=ホワイトスペース
   status: RE/[0-9]\{3\}/;
   : HTTP_WS;
   reason: bytestring &restofdata;
 } &oneline, &let { 
   bro_gen_resp: bool = bro_event_http_reply(
   $context.connection.bro_conn,
   version.vers_str, to_int(status), reason);
 };
 type HTTP_Version = record { 
    "HTTP/";
    vers_str: RE/[0-9]+\.[0-9]+/;
 };


ポイントはversion.vers_str みたいな参照ができる点.こういうのを作りたいと思っていた.

これってネットワークプロトコルだけでなく普通のプログラミング言語にもつかえるかな.