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

(1)

#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