#include #include #include #include int OPTYPES[] = { 0, -1, -1, 0, 3, 3, 3, 3, 3, /* flow */ -1, 1, 1, /* IO */ -1, 0, 0, /* heap */ -1, 1, 1, /* arith */ 0, 0, 0, 2, -1, 2, -1, 2, 2, /* stack */ }; char *OPNAMES[] = { "exit", "E1", "E2", "ret", "jn", "jz", "jmp", "call", "mark", "E9", "read", "out", "E12", "retrieve", "store", "E15", "div-mod-ERR", "add-sub-mul", "discard", "swap", "dup", "slide", "E22", "copy", "E24", "push-", "push", }; int main(int argc, char *argv[]) { FILE *fp; int sz, i, t; unsigned char mp = 0; char *pg, *pgend, c; int *label[256], *sf[256], **sfp = sf, mem[256], heap[256]; int *ops, *end; char *lab_str[256]; if (argc < 2) return 1; fp = fopen(argv[1], "r"); fseek(fp, 0, SEEK_END); sz = ftell(fp); pg = (char *)malloc(sizeof(char)*sz); fseek(fp, 0, SEEK_SET); fread(pg, 1, sz, fp); fclose(fp); for (i = 0; i < 256; i++) { lab_str[i] = NULL; mem[i] = heap[i] = 0; } for (i = 0, pgend = pg; i < sz; i++) { t = pg[i]; if (t == '\n' || t == '\t' || t == ' ') { *pgend++ = 2-pg[i]%4; } } ops = end = (int *)malloc(sizeof(int)*(pgend-pg)); while (pg < pgend) { if (0) { char *x; for(x=pg;x> 5; // printf("%x %s\n", ops, OPNAMES[opc]); if (opc == 25 || opc == 26) mem[++mp] = op&1 ? -opr : opr; else if (opc == 23) { mem[mp+1] = mem[mp-opr]; mp++; } else if (opc == 21) { mem[mp-opr] = mem[mp]; mp -= opr; } else if (opc == 20) { mem[mp+1] = mem[mp]; mp++; } else if (opc == 19) { i = mem[mp]; mem[mp] = mem[mp-1]; mem[mp-1] = i; } else if (opc == 18) { mp--; } else if (opc == 17) { opr>1 ? mem[mp-1] += mem[mp] : opr>0 ? mem[mp-1] -= mem[mp] : (mem[mp-1] *= mem[mp]); mp--; } else if (opc == 16) { opr>1 ? mem[mp-1] /= mem[mp] : (mem[mp-1] %= mem[mp]); mp--; } else if (opc == 14) { assert(mem[mp] >= 0 && mem[mp] < 256); heap[mem[mp-1]] = mem[mp]; mp-=2; } else if (opc == 13) { assert(mem[mp] >= 0 && mem[mp] < 256); mem[mp] = heap[mem[mp]]; } else if (opc == 11) { opr>1 ? putchar(mem[mp--]) : printf("%d", mem[mp--]); } else if (opc == 10) { opr>1 ? heap[mem[mp--]]=getchar() : scanf("%d", &heap[mem[mp--]]); } else if (opc == 7) { *sfp = ops; sfp++; ops = label[opr]; } else if (opc == 6) { ops = label[opr]; } else if (opc == 5) { if (!mem[mp--]) ops = label[opr]; } else if (opc == 4) { if (mem[mp--]) ops = label[opr]; } else if (opc == 3) { ops = *--sfp; } else if (opc == 0) { return 0; } else assert(0); } assert(0); return 1; }