* 川合のプログラミング言語自作のためのテキスト第二版#0010
-(by [[K]], 2019.06.30)

** (17) TL-3k
-次はTL-3dを書き直してみます。やってみたら45行になりました。
 #include "kll0.h"
 
 int main(int argc, const char **argv)
 {
     KLexer lx(NEW1(kautoreleasePool, KStringId)("; = + - print while ( < ) { } time"));
     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, wpc = 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 == 5 && le[pc + 1].i == 6 && le[pc + 3].i == 7 && le[pc + 5].i == 8 && le[pc + 6].i == 9) {	// while.
             wpc = pc - 1;
             if (var[le[pc + 2].i] < var[le[pc + 4].i]) {
                 pc += 7 - 1;
             } else {	// 条件不成立なので } の次まで読み飛ばす.
                 while (pc < n && le[pc].i != 10)
                     pc++;
             }
             continue;
         } else if (le[pc].i == 10) {
             pc = wpc;
             continue;
         } else if (le[pc].i == 11 && le[pc + 1].i == 0) { // time.
             printf("time=%.3f[sec]\n", clock() / (double) CLOCKS_PER_SEC);
         } 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\n", le[pc].p0);
     kerrorExit("syntax error : %.30s", le[pc].p0);
 }


** 次回に続く
-次回: [[text0020]]

*こめんと欄
#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS