パーサアクションだけであと 1500 行もあるのか……。 急激に眠くなってきた。
ところでパーサつながりで Racc を改造する話を思い出した。 なんか net/http の要望とかパッチもたくさんもらってるし、 非常にあれだね。忙しいみたいだね (他人事)。
まあ文明開闢以来このかた、 なにかしらやることがあるほうが無職ひきこもり生活よりは三百倍いいと決まってますが、 そんなこと言って元がマイナスだったらどうするんだょとか思ったりもするわけですが、 でもマイナスの人生ってなんだろうとか考え出すとそれはそれで ヤバげな境地に到達してしまいそうですので、 現代日本社会の病理を反映した軽薄で殺那的な認識でお茶を濁そうと思います。
という文章を見て睡眠時間が不足していると喝破できるようであれば あなたはかなりの日記まにあです。まにあっくです。 えにあっくではありません。
おお! マニアックと ENIAC って似てるね!
そんなのどうでもいいんです。
また寝て、起きた。(17:00)
わたしが発作的に自宅のベランダからダイヴしたり餓死したりした場合に備えて (状況設定が微妙にリアルだな)、Ripper の作りかたを書いておきます。
そうそう、最後のが問題なんだった。この段階は自動判別が難しく、 アクションから残すコードと残さないコードを人力で選ばないといけない。 例えば NODE 関連のコードは全て消すか置き換えるかしないといけないが、 lex_state などは残さないとならない。
これまではアクションを完全に書き換えていたのだが、 それだと parse.y が共有できないので、今回はこんなふうにしてみた。
program : { lex_state = EXPR_BEG; top_local_init(); class_nest = !toplevel_p(); /*% lex_state = EXPR_BEG; class_nest = !toplevel_p(); $$ = Qnil; %*/ }
コメント外が Ruby 用で /*%〜%*/ が Ripper 用。 #ifdef RIPPER だと読みにくすぎることが判明したのでこうしてみました。 どうせ Ruby があるのは前提なので、プリプロセスしまくります。
dispatch* (イベント生成マクロ) を使う例はこんな感じ。
stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem { $$ = NEW_ALIAS($2, $4); /*% $$ = dispatch2(alias, $2, $4); %*/ }
引数の数によって名前が変わるのはちょっとダサいな。
C の可変長引数マクロって C99 だっけ。 こういうの↓
#define m(fmt, ...) vprintf(fmt, __VA_ARGS__)
やっぱ C99 か。ちょい新しすぎるな。
どっちにしても va_list を使うには どこかで引数の数を指定する必要があるのね。 あきらめよう。
やっとアクションの変更が終わった。 今日はここまで。
えっ。賞味期限切れ食品が不足してるのかと……
MANIAC です → http://www.lanl.gov/worldview/welcome/history/22_computers.html
ほんっとーにどうでもいいですね.
賞味期限切れ食物は常時補給しているので問題ありません