text0019
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 川合のプログラミング言語自作のためのテキスト第二版#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)("; = + -...
char *txt = (char *) kerrorExitP0(kreadFileA(argv[1]...
KLexer_Elmt *le = (KLexer_Elmt *) lx.add(txt)->p;
int pc = 0, wpc = 0, *var = (int *) kautoreleasePool...
for (int i = 0; i < *lx.sid->n; i++)
var[i] = lx.getConstInt(i); // intではないときは...
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...
var[le[pc].i] = var[le[pc + 2].i] + var[...
} else if (le[pc + 3].i == 3 && le[pc + 5].i...
var[le[pc].i] = var[le[pc + 2].i] - var[...
} else
goto err;
} else if (le[pc].i == 5 && le[pc + 1].i == 6 &&...
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) ...
printf("time=%.3f[sec]\n", clock() / (double...
} else if (le[pc].i == 4 && le[pc + 2].i == 0) {...
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);
}
** 次回に続く
-次回: [[text0020]]
*こめんと欄
#comment
終了行:
* 川合のプログラミング言語自作のためのテキスト第二版#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)("; = + -...
char *txt = (char *) kerrorExitP0(kreadFileA(argv[1]...
KLexer_Elmt *le = (KLexer_Elmt *) lx.add(txt)->p;
int pc = 0, wpc = 0, *var = (int *) kautoreleasePool...
for (int i = 0; i < *lx.sid->n; i++)
var[i] = lx.getConstInt(i); // intではないときは...
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...
var[le[pc].i] = var[le[pc + 2].i] + var[...
} else if (le[pc + 3].i == 3 && le[pc + 5].i...
var[le[pc].i] = var[le[pc + 2].i] - var[...
} else
goto err;
} else if (le[pc].i == 5 && le[pc + 1].i == 6 &&...
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) ...
printf("time=%.3f[sec]\n", clock() / (double...
} else if (le[pc].i == 4 && le[pc + 2].i == 0) {...
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);
}
** 次回に続く
-次回: [[text0020]]
*こめんと欄
#comment
ページ名: