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。