history

青木日記 RSS

<前の日 | この月 | 次の日>

2003-10-24

Ripper

Ripper 新版作成中。 Ruby の parse.y をそのまま使えるようにしつつ Ripper のコードを埋め込んでみようと思う。

……超後悔した。

Ripper (2)

引き続き後悔中。

ちょっと思ったんだけど、クラス名は Ripper より Ruby::Parser のほうがよいのではなかろうか?

Ripper (3)

パーサアクションだけであと 1500 行もあるのか……。 急激に眠くなってきた。

ところでパーサつながりで Racc を改造する話を思い出した。 なんか net/http の要望とかパッチもたくさんもらってるし、 非常にあれだね。忙しいみたいだね (他人事)。

まあ文明開闢以来このかた、 なにかしらやることがあるほうが無職ひきこもり生活よりは三百倍いいと決まってますが、 そんなこと言って元がマイナスだったらどうするんだょとか思ったりもするわけですが、 でもマイナスの人生ってなんだろうとか考え出すとそれはそれで ヤバげな境地に到達してしまいそうですので、 現代日本社会の病理を反映した軽薄で殺那的な認識でお茶を濁そうと思います。

という文章を見て睡眠時間が不足していると喝破できるようであれば あなたはかなりの日記まにあです。まにあっくです。 えにあっくではありません。

おお! マニアックと ENIAC って似てるね!

そんなのどうでもいいんです。

Ripper (4)

また寝て、起きた。(17:00)

わたしが発作的に自宅のベランダからダイヴしたり餓死したりした場合に備えて (状況設定が微妙にリアルだな)、Ripper の作りかたを書いておきます。

  • parse.y をコピーしてくる
  • extern 関数を #ifndef RIPPER で消す
  • NODE・シンボル・lvar・dvar 関連の関数も必要ないので #ifndef RIPPER で消す
  • まだ必要なグローバル変数 (extern/static とも) を全部構造体に移し、 そっちを参照するようマクロを書きまくる
  • ripper 独自の関数をちょっと追加 (主に入力系統)
  • dispatch / sdispatch しまくる

そうそう、最後のが問題なんだった。この段階は自動判別が難しく、 アクションから残すコードと残さないコードを人力で選ばないといけない。 例えば 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 を使うには どこかで引数の数を指定する必要があるのね。 あきらめよう。

Ripper (5)

やっとアクションの変更が終わった。 今日はここまで。

本日のツッコミ(全3件) [ツッコミを入れる]
ただただし (2003-10-24 12:13)

えっ。賞味期限切れ食品が不足してるのかと……

きしもと%薀蓄・昔話系 (2003-10-24 12:40)

MANIAC です → http://www.lanl.gov/worldview/welcome/history/22_computers.html

ほんっとーにどうでもいいですね.

あおき (2003-10-24 17:44)

賞味期限切れ食物は常時補給しているので問題ありません

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS