バッカスの酒

http://sakura.nanika.jp/diary/nicky.cgi?DT=20060426A#20060426A

全体をざっくりBNFで書くとこんな感じですかね。
RFCで使われてるEBNFちっくですが。

SVGdeffile      = versionline CRLF definition
versionline     = string
definition      = svg-token *(svg-separator svg-token)
svg-separator   = CRLF | ","
svg-token       = "/EOF"
                | key "=" value
key             = empty
                | "sakura"
                | "unyu"
                | "craftman"
                | "url"
                | "hpname"
                | "surfacefile"
                | "update"
                | "ghostname"
                | "supported"
                | "sakura-action"
                | "surface"
value           = empty
                | string
                | surface-token
surface-token   = surface-no ":" sprite-no
surface-no      = number
                | number "-" number
sprite-no       = number
                | "*" | "+" | "-1" | "-2"

empty  : 空文字列トークン
number : [0-9]+ トークン
string : 任意の文字列トークン


注1:トークン間の空白文字は読み飛ばす
   但し""で囲まれたものは1つのトークンとして扱う
注2:keyには必須のものとオプショナルなものがあることに注意せよ
注3:emptyなkeyは、"surface"と同等に扱う
注4:key に対して許される value の値には制限があることに注意せよ。
   ・"surface" key に対しては surface-token value しか許されない
   ・"update" key に対しては、yyyy/mm/dd 形式の文字列しか許されない
注5:versionline の先頭3文字がバージョン判別のために用いられる

本当は日本語で書いてる部分とかを、もっときちっと定義しないといけないのだけど
えらい長くなるのでパス。
プログラム屋さんには、日本語でずらずらと説明するよりも、なんちゃってBNF
書いてあげた方が理解が早いand/or正確なことがよくあります。


というか、完全に正確に(トークン定義つきで)書かれたBNFは、
そのまま実際に動くプログラムに変換できるわけで。


最も、拙作のツールなんかではBNF→BISONなんてしてないで、
さくらスクリプトでもSVGでも適当にごりごり読んでますが。