#include #include void run(const char* bytecode, int start, int stop, int step) { // interpreter state (e.g. registers) int pc = 0; int top; int current = start; int col = 0; int row = 0; // interpretive loop while (bytecode[pc]) { char c = bytecode[pc++]; if (c == '\n') { col = 0; row += 1; } // interpretive dispatch if (c != '%') { putchar(c); // opcode } else { switch (bytecode[pc++]) { case '[': top = pc; break; // opcode case ']': pc = current > stop ? pc : top; break; // opcode case 'i': printf("%d", current); current += step; break; // opcode case 'r': printf("%d", row); break; // opcode case 'c': printf("%d", col++); break; // opcode case '%': putchar('%'); break; // opcode default: assert(0); break; } } } } int main(int argc, char* argv[]) { // program to be interpreted run("\tcol%c\tcol%c\tcol%c\n%[row%r:\t%i,\t%i,\t%i\n%]", 10, 30, 3); return 0; }