Misa をとらんすれ〜としてみちゃったのぉぉぉっ

プログラミング言語 MisaYet Another Misa - 32nd Diary(2010-01-12) にインスパイヤされてプログラミング言語 Misa をトランスレートしてみました。

こうした bf 系の処理はパースしてインタプリターを作っても良いのですが、それなりにプログラムが長くなってしまいます。 brainfuck on AWK - 無何有日記 には awk を用いた bf の処理系が書かれていますが、やはりそれなりに長いスクリプトになっていることが分かります。

そこで、ここでは awk へのトランスレーターを作ってみます。

#!/usr/bin/gawk -f
# misa2awk.awk
# Misa を awk にトランスレートします
# usage: gawk -f misa2awk.awk foo.misa

BEGIN {
    print "BEGIN {";
    print "c = 0";
}

{
    gsub(/[^]」』[「『+あぁおぉ\-っッ>~ー.!!,??★☆]/, "");
    gsub(/[]」』]/, "  }\n");
    gsub(/[[「『]/, "  while(b[c] != 0) {\n");
    gsub(/[+あぁおぉ]/, "  ++b[c];\n");
    gsub(/[-っッ]/, "  --b[c];\n");
    gsub(/[>~ー]/, "  ++c;\n");
    gsub(/[<☆★]/, "  --c;\n");
    gsub(/[.!]/, "  putchar(b[c]);\n");
    gsub(/[,?]/, "  b[c] = getchar();\n");
    print $0;
}

END {
    print "}";
    print "function getchar(ch) {";
    print "while (getline > 0) {";
    print "ch=substr($0,1,1)";
    print "}";
    print "return ch";
    print "}";
    print "function putchar(ch) {";
    print "printf(\"%c\",ch)";
    print "}";
}

トランスレーターなので非常に短く作られています。

さて、実行してみます。

$ cat test.misa
ごっ、ごぉおっ、ご~きげんよおぉおおぉおほっ。ほおぉおぉおっ。

「ごきげん☆みゃぁああ”あ”ぁ”ぁああ~っ」

さわやかな朝の☆ご挨拶! お挨拶がっ。
澄みきった青空にこだましちゃうぉ~ああぉおおおぉん。

「は、はひっ、はろおぉっ☆わぁるどおおぉっぉ~っ」

こ、この文章は☆おサンプル! おおぉおぉおおサンプルプログラム!!
どんなおプログラム言語でも基本のご挨拶させていただくのぉぉおッ!

「ぽうっ」

長々と書くのがこ、ここでの~、ここでのぉおおぉおぉぉおたしなみぃぃいぃ。

「長いぃ。長すぎましゅう。ご挨拶にこんなプログラム長すぎまひゅぅうぅ☆
 んおおぉぉ、ばかになる、おばかになっちゃいましゅ~ッ」

長いのがっ、バッファの奥まで入ってきましゅたぁあぁあっ!
ばっふぁ☆溢れちゃいまひゅぅ~。あみゃぁあ”あ”ぁ”ぁああ”あ”ぁぁ。

「で、出ます☆ んおおぉぉおおっ、エラー出ちゃいまひゅっ」

ほひぃ☆! え、えらーっ、んお”お”ぉお”お”ぉおぉおおぉっっ。

「出た☆ 出た出た出た出たぁぁあっ えらあぴゅるーっって出たあぁっ」

はしたない☆! ぉおおぉはしたないっ! おはしたない言語ですっっっっっっっ!
おほっほおぉっっっほおぉっっっっっっっっっ!

「えらあらいしゅきぃぃぃいぃっっ」

止まらない すごい エラーみるく
こってりしたのがいっぱい出てるよぉぉぉおおぉぉおおぉぉおっっ。

「んほぉっ☆ っおぉぉぉおお国が分からなくなっちゃいまひゅう~っ」

ま、まだ出るぅ☆ 出てるのおぉっ☆ エラーまだまだ出ましゅぅぅ!
ばんじゃ~ぁぁあい、ばんじゃいぃぃ、ばんにゃんじゃぁんじゃあぁぁああぁい!

$ gawk -f misa2awk.awk test.misa > test.awk

$ gawk -f test.awk
HelloWorld!

Misa の最大の欠点は文章が面白く (?) なるように考えるところで、面倒なので プログラミング言語 Misa の例文を利用させていただきました。

tag_gawk.png tag_gawk.png