sclass ShuntingYardParser_v2 > ShuntingYardCore is Steppable { // input LS tok; int iTok = 1; // transitional int iLiteralStart; *() {} *(S s) { this(noTok(s)); } *(LS *tok) {} run { stepAll(this); } public bool step() { if (iTok >= l(tok)) { finishLiteral(); handleEOT(); false; } S t = tok.get(iTok); bool space = isSpacer(t); if (!space) { if (isOperatorOrBracket(t)) { finishLiteral(); handleToken(t); } else if (iLiteralStart == 0) iLiteralStart = iTok; } iTok += 2; true; } @Override int precedence(S op) { if (eqOneOf(op, "*", "/")) ret 2; if (eqOneOf(op, "+", "-")) ret 1; ret 0; } bool isSpacer(S t) { ret emptyAfterTrim(t); } @Override bool isOperator(S t) { ret !isSpacer(t) && !startsWithLetterOrDigit(t) && !eq(t, "."); } void finishLiteral { if (iLiteralStart == 0) ret; S s = joinSubList(tok, iLiteralStart, iTok-1); if (!isSpacer(s)) handleToken(s); iLiteralStart = 0; } // returns list that can be processed with CalcRPN LS get() { run(); ret outputQueue; } }