川合のプログラミング言語自作のためのテキスト第二版#0009

(16) TL-2k

#include "kll0.h"

int main(int argc, const char **argv)
{
    KLexer lx(NEW1(kautoreleasePool, KStringId)("; = + - print"));
    char *txt = (char *) kerrorExitP0(kreadFileA(argv[1], "rt", 2), "usage>%s program-file", argv[0]);
    KLexer_Elmt *le = (KLexer_Elmt *) lx.add(txt)->p;
    int pc = 0, *var = (int *) kautoreleasePool->alloc((*lx.sid->n) * sizeof (int));
    for (int i = 0; i < *lx.sid->n; i++)
        var[i] = lx.getConstInt(i);	// intではないときは0を返す.
    for (int n = lx.getElmtLen(); pc < n; pc++) {
        if (le[pc + 1].i == 1) { // 2単語目が"=".
            if (le[pc + 3].i == 0) {	// 単純代入.
                var[le[pc].i] = var[le[pc + 2].i];
            } else if (le[pc + 3].i == 2 && le[pc + 5].i == 0) { // 加算.
                var[le[pc].i] = var[le[pc + 2].i] + var[le[pc + 4].i];
            } else if (le[pc + 3].i == 3 && le[pc + 5].i == 0) { // 減算.
                var[le[pc].i] = var[le[pc + 2].i] - var[le[pc + 4].i];
            } else
                goto err;
        } else if (le[pc].i == 4 && le[pc + 2].i == 0) { // print.
            printf("%d\n", var[le[pc + 1].i]);
        } else
            goto err;
        while (le[pc].i != 0)
            pc++;
    }
    exit(0);		// ファイル終端.
err:
    kerrorExit("syntax error : %.30s", le[pc].p0);
}

次回に続く

こめんと欄


コメントお名前NameLink

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS