Making PL/0(その1)

この前の日記わーい \(^o^)/ PL/0を JS で書いたよー! - ockeghem(徳丸浩)の日記で、JavaScript記述のPL/0を紹介したが、その開発過程を少し紹介してみたいと思う。
私の開発スタイルはどういうネーミングをしたらよいのか分からないが、ここ20年くらい、以下のような泥縄的なプロセスでやっている。つまり必要なものから作っていくということだ。

開発の途中経過を残していなかったので、記憶や、ゴミ箱から回収したファイルを元に再現したものを示そう*1

JavaScriptでPL/0を作ろうと思い立って、最初に作ったものはおおよそ以下のような字句読み取り器だった。

var keywords = {
    "begin"   : BEGIN,
    "end"     : END,
    "program" : PROGRAM,
}
var src = '';

function getToken() {
    src = src.replace(/^[ \t\r\n]+/, "");
    var token = '';
    if (src == '')
        return null;
    if (src.match(/^[a-z_][a-z0-9_]*/i)) {
        src = src.replace(/^([a-z_][a-z0-9_]*)/i, "");
        token = RegExp.$1;
        kind  = IDENT;
        if (keywords[token]) {
            kind = keywords[token];
        }
    } else if (src.match(/^[0-9]+/)) {
        src = src.replace(/^([0-9]+)/, "");
        token = RegExp.$1;
        kind = NUMBER;
    } else {
        token = src.charAt(0);
        src = src.substring(1);
        kind = OTHERS;
    }        
    return kind;
}

プログラム全体はこちら*2
プログラム全体をご覧いただけば分かることだが、はじめからテスト用のPL/0コードも埋め込んで、字句読み取り器をテストすることからはじめた。
ご覧のように、いかにも泥縄的だ。記憶を頼りに作っているので、PL/0の予約語に"program"が入っていたりする。これではPascalだ。

それはともかく、いったんこう書いてみて、一旦はテストまでしたところで、これはいかにもダラダラしたプログラムになりそうだと思った。PL/0の原典であるPascalのソースは、こんなものでなく、もっともっとダラダラしているのだが、それを割り引いてもちょっと耐えられない。それに、グローバル変数を多用することになりそうな点も、Pascal的で面白くない。

そこで、プログラムが動く状態を維持しながら、プログラムを書き換えることにした。
続く(多分)。

*1:なんか、ジュラシックパークの恐竜みたいだけど。

*2:HTMLソース内に、<text/pl0>でPL/0のソースを記述する方法は、Logo on JavaScriptを参考にさせていただいた。