TL-1のさらなるコンパクト化

  • (by K, 2019.06.09)

(1)

  • text0001で紹介したTL-1はC言語で標準関数しか使わないのに65行で書けていてとてもシンプルです。
  • これをより小さくすることなんてできないと当時は思っていたのですが、もっと短く書く方法を思いついたので紹介します。以後これをTL-1cと呼びます。
  • まず結論から言うと、たったの52行になります。
  • 主な変更点としては、変数txtやpcなどを外部変数にするをやめます(これは将来の拡張を考えると外部変数にしておくほうがいいのですが、ひとまずTL-1cではそういうことは全部無視して、純粋に小さくすることだけを考えます)。
  • 次に定数の特別扱いをやめます。たとえば「2」という文字列は、定数2を意味するのではなく、「2」という名前の変数だと思うことにします。こうすることで定数かどうかの判定は不要になって、プログラムは短くなるし高速になります。
  • ただし、単に「2」を変数扱いするだけだとうまくいきません。変数「2」には初期値として2を入れておかなければいけないのです。そうすることで、a=2;という命令で、aに2がちゃんと入るようになるわけです。
  • このような仕様だと、2=3;とかいう意味不明な代入文がエラーにならず、しかもなんとこれ以降3が2を意味するようになってしまうわけですが、「そういうおかしいプログラムは実行しないでください。実行した場合の結果については未定義です」っていう仕様にして、この場を切り抜けることにします(笑)。
#include <stdio.h>
#include <stdlib.h>

void loadText(int argc, const char **argv, unsigned char *t, int siz) → TL-1と同じなので省略

int main(int argc, const char **argv)
{
    unsigned char txt[10000]; // ソースコード.
    int i, pc, var[256];	// 変数.
    loadText(argc, argv, txt, 10000);
    for (i = 0; i < 10; i++)
        var['0' + i] = i; // 定数を変数扱いにする代わりに初期値を設定する.
    for (pc = 0; txt[pc] != 0; pc++) {
       if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc] == '\t' || txt[pc] == ';')   // 空行など.
            continue;
        if (txt[pc + 1] == '=') { // 2文字目が"=".
            if (txt[pc + 3] == ';') { // 単純代入.
                var[txt[pc]] = var[txt[pc + 2]];
            } else if (txt[pc + 3] == '+' && txt[pc + 5] == ';') { // 加算.
                var[txt[pc]] = var[txt[pc + 2]] + var[txt[pc + 4]];
            } else if (txt[pc + 3] == '-' && txt[pc + 5] == ';') { // 減算.
                var[txt[pc]] = var[txt[pc + 2]] - var[txt[pc + 4]];
            } else
                goto err;
        } else if (txt[pc] == 'p' && txt[pc + 1] == 'r' && txt[pc + 5] == ' ' && txt[pc + 7] == ';') { // 最初の2文字しか調べてない(手抜き).
            printf("%d\n", var[txt[pc + 6]]);
        } else
            goto err;
        while (txt[pc] != ';')
            pc++;
    }
    exit(0);
err:
    printf("syntax error : %.10s\n", &txt[pc]);
    exit(1);
}

こめんと欄


コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-06-09 (日) 11:09:17 (75d)