(2-1) レジスタマシン用のコンパイラ[33行]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *s;
char a[4096], t;
char compile(int pri)
{
char r, q, op;
if (*s == '(') {
s++; r = compile(99); s++; // ')'を読み飛ばす.
} else {
r = *s++; // 数値もしくは変数.
}
for (;;) {
op = *s++;
if (pri >= 4 && (op == '*' || op == '/' || op == '%')) {
q = compile(3); sprintf(a + strlen(a), "%c %c,%c,%c\n", op, t, r, q); r = t++;
} else if (pri >= 5 && (op == '+' || op == '-')) {
q = compile(4); sprintf(a + strlen(a), "%c %c,%c,%c\n", op, t, r, q); r = t++;
} else
break;
}
s--; return r;
}
int main(int argc, const char **argv)
{
s = argv[1]; if (s == NULL) return 1;
t = 't'; char r = compile(99); printf("%sresult=%c\n", a, r);
return 0;
}
このプログラムをコンパイルして、reg.exeを作ったとします。
>reg 1+2*3
* t,2,3 → MUL(t, 2, 3); // t=2*3;
+ u,1,t → ADD(u, 1, t); // u=1+t;
result=u → 計算結果はuに入っています、という意味です。 tとかuは一時変数です。
>reg (1+2)*3
+ t,1,2
* u,t,3
result=u
>reg (X+Y-1)*(A+B)
+ t,X,Y
- u,t,1
+ v,A,B
* w,u,v
result=w