文法を型で定義 その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 みたいな参照ができる点.こういうのを作りたいと思っていた.