ではTJ-03cではどうしたらいいでしょうか。gccみたいに「書き換えができるケースは自動的に書き換えを実施する」・・・のをここでやるのはちょっと面倒なので、新規にdo { ~ } while構文を追加して、この構文を使えばgccと同じくらいに高速になるよー、ということにします。
→ mainより前の部分はTJ-03bと同じなので省略
int main(int argc, const char **argv)
{
static String def[] = { ";", "=", "+", "-", "print", "while", "(", "<", ")", "{", "}", "time", "do", 0 };
→ この部分もTJ-03bと同じなので省略
for (pc = 0; pc < pc1; pc++) {
if (varNum[pc + 1] == 1 /* = */) { // 2単語目が"=".
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 12 /* do */ && varNum[pc + 1] == 9 /* { */) {
wqc = qc;
pc++;
continue;
} else if (varNum[pc] == 10 /* } */ && varNum[pc + 1] == 5 /* while */ && varNum[pc + 2] == 6 /* ( */ && varNum[pc + 4] == 7 /* < */ && varNum[pc + 6] == 8 /* ) */ && varNum[pc + 7] == 0 /* ; */) {
if (varNum[pc + 3] == regvar && '0' <= varName[varNum[pc + 5]][0] && varName[varNum[pc + 5]][0] <= '9') {
code[qc++] = 0x81;
code[qc++] = 0xc0 + 7 * 8 + EBX;
qc += put32(&code[qc], var[varNum[pc + 5]]);
} else {
if (varNum[pc + 3] == regvar || varNum[pc + 5] == regvar) goto err;
code[qc++] = 0x8b; // MOV EAX,[...]
code[qc++] = EAX * 8 + 0x05;
qc += put32(&code[qc], (int) &var[varNum[pc + 3]]);
code[qc++] = 0x8b; // MOV ECX,[...]
code[qc++] = ECX * 8 + 0x05;
qc += put32(&code[qc], (int) &var[varNum[pc + 5]]);
code[qc++] = 0x39;
code[qc++] = 0xc8;
}
code[qc++] = 0x0f;
code[qc++] = 0x8c;
qc += put32(&code[qc], &code[wqc] - &code[qc + 4]);
} else if (varNum[pc] == 5 /* while */ && varNum[pc + 1] == 6 /* ( */ && varNum[pc + 3] == 7 /* < */ && varNum[pc + 5] == 8 /* ) */ && varNum[pc + 6] == 9 /* { */) {
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 10 /* } */) {
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 11 /* time */ && varNum[pc + 1] == 0 /* ; */) { // time.
→ この部分もTJ-03bと同じなので省略
} else if (varNum[pc] == 4 /* print */ && varNum[pc + 2] == 0 /* ; */) { // print.
→ この部分もTJ-03bと同じなので省略
} else
goto err;
while (varNum[pc] != 0 /* ; */)
pc++;
}
→ この部分もTJ-03bと同じなので省略
}