* 川合のプログラミング言語自作のためのテキスト#0004 -(by [[K]], 2019.02.25) ** (9) TJ-01 -TL-1~TL-3は普通のインタプリタ型の言語でした。これをそのまま発展させていってももちろんいいのですが、私はJITコンパイラこそプログラミング言語の本命だと思っているので(それは[[text0001]]に書いた通り)、ここから先はJITコンパイラの作りかたを説明していこうと思います。 -以下に示すTJ-01はTL-1の改良版です。変数名は1文字しか許しませんが、数値定数に関しては複数桁を許します。 -以下に示すTJ-01はあえてさかのぼってTL-1の改良版です。変数名は1文字しか許しませんが、数値定数に関しては複数桁を許します。 #include <stdio.h> #include <stdlib.h> void loadText(int argc, const char **argv, unsigned char *t, int siz) → TL-1と同じなので省略 int var[256]; // 変数. unsigned char txt[10000]; // ソースコード. int pc = 0; // プログラムカウンタ. int getNumber() // 定数は2桁以上でもOK. { unsigned char c = txt[pc], *p, *q; int i; if ('0' <= c && c <= '9') { // 数字 p = &txt[pc]; i = strtol(p, (char **) &q, 0); pc += q - p; return i; } pc++; return var[c]; // 1文字の変数. } int main(int argc, const char **argv) { int i, j, pc0; loadText(argc, argv, txt, 10000); for (;;) { pc0 = pc; if (txt[pc] == 0) // ファイル終端. exit(0); if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc] == '\t' || txt[pc] == ';') { // 空行など. pc++; } else if (txt[pc + 1] == '=') { // 2文字目が"=". i = txt[pc]; // 1文字の変数名. pc += 2; j = getNumber(); if (txt[pc] == ';') { var[i] = j; } else if (txt[pc] == '+') { // 加算. pc++; var[i] = j + getNumber(); } else if (txt[pc] == '-') { // 減算. pc++; var[i] = j - getNumber(); } else goto err; } else if (txt[pc] == 'p' && txt[pc + 1] == 'r' && txt[pc + 5] == ' ') { // 最初の2文字しか調べてない(手抜き). pc += 6; printf("%d\n", getNumber()); } else goto err; } err: printf("syntax error : %.10s\n", &txt[pc0]); exit(1); } -このTJ-01は以下のプログラムを実行できます。 a=123; b=456; c=a+b; c=c-321; print c; -ここまでついてこられている人は、たぶん特に説明がなくてもTJ-01は理解できると思います。 ** 次回に続く -次回: [[text0005]] *こめんと欄 #comment