sclass SimpleLeftToRightParser { S text; LS tok; ListAndIndex ptr, mainLoopPtr; S currentToken; bool caseInsensitive; *(S *text) {} *(LS *tok) {} S t() { ret currentToken; } S tpp() { var t = t(); next(); ret t; } bool is(S t) { ret eqOrEqic(caseInsensitive, currentToken, t); } bool isInteger() { ret isInteger(t()); } bool isInteger(S s) { ret main isInteger(s); } void next { if (!endOfText()) ptr(ptr.plus(2)); } void ptr(ListAndIndex ptr) { this.ptr = ptr; fetch(); } bool atEnd aka endOfText() { ret ptr.atEnd(); } void fetch { currentToken = ptr!; } void init { tok if null = javaTok(text); ptr(ListAndIndex(tok, 1)); } bool mainLoop() { if (atEnd()) false; if (eq(mainLoopPtr, ptr)) fail("main loop didn't advance"); mainLoopPtr = ptr; true; } void unknownToken { warn("Unknown token: " + t()); } }