This is a finite-state machine:
private int recursive(int rc, int pc, int sc) {
for (;;) {
Instruction actual = program[rc][pc];
switch (actual.type) {
case FIRST:
if (sc >= input.length || input[sc] != actual.c1) return -1;
pc++; sc++;
continue;
case SECOND:
pc = actual.n1;
continue;
case THIRD:
int result = recursive(rc, actual.n1, sc);
if (result != -1) return result;
pc = actual.n2;
continue;
case FOURTH:
result = recursive(actual.n1, 0, sc);
if (result == -1) return -1;
pc++; sc = result;
continue;
case FIFTH:
if (sc == input.length) return sc;
return -1;
}
return -1;
}
}
Thanks for helping.