raccで楽々
さあ怒れ。みんなこの温いタイトルに憤死しろ。憤死した人を見てみたいんだ。
会社で使うグループウェアをiCalへ反映させるスクリプトを書く事にした。例によって'end の行が来るまでが 1 エントリ、tab で始まると継続'とか状態ありありなんでFile.openだけじゃ面倒。当然面倒臭い行処理は全部raccさんに任せる。行内の処理は正規表現でできる範囲なので、lexer はチョー(死語)適当に
rule entry: START ID args END { } /* do something */ args : STR {} /* returns val[0] */ | args TABS STR { result = val[0] + val[2] } #---- inner ---- # はてな日記パーサが /^-+/ を parse しよるので外す def parse(line) @tokens=[] case line when /^start?s(?w+)/ @tokens.push([:START, "start"]) @tokens.push([:ID, $1]) when /^end/ @tokens.push([:END, "end"]) when /^?t+(.*)/ @tokens.push([:TABS, '?t']) @tokens.push([:STR, $1]) end end
と。いやlexer で parse してるじゃんとか言わない。いいのこれで。どうせ(略)なんだから状態の面倒なとこだけraccに任せた方がいい。といいつつも、書き方をよく忘れるのでメモしているのだ。
結局思い立って10分もかからずに全部パースしてオブジェクトに変換完了。素晴らしいracc。