// make sure that peeking starts at the current scan position public void ResetPeek() { pt = tokens; }
Token NextToken() { while (ch == ' ' || ch >= 9 && ch <= 10 || ch == 13) { NextCh(); } int recKind = noSym; int recEnd = pos; t = new Token(); t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; int state; state = start.ContainsKey(ch) ? start [ch] : 0; tlen = 0; AddCh(); switch (state) { case -1: { t.kind = eofSym; break; } // NextCh already done case 0: { if (recKind != noSym) { tlen = recEnd - t.pos; SetScannerBehindT(); } t.kind = recKind; break; } // NextCh already done case 1: recEnd = pos; recKind = 1; if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') { AddCh(); goto case 1; } else { t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return(t); } case 2: recEnd = pos; recKind = 2; if (ch >= '0' && ch <= '9') { AddCh(); goto case 2; } else if (ch == '.') { AddCh(); goto case 3; } else { t.kind = 2; break; } case 3: recEnd = pos; recKind = 2; if (ch >= '0' && ch <= '9') { AddCh(); goto case 3; } else { t.kind = 2; break; } case 4: if (ch <= 9 || ch >= 11 && ch <= 12 || ch >= 14 && ch <= '!' || ch >= '#' && ch <= '[' || ch >= ']' && ch <= 65535) { AddCh(); goto case 4; } else if (ch == '"') { AddCh(); goto case 5; } else { goto case 0; } case 5: { t.kind = 3; break; } case 6: { t.kind = 7; break; } case 7: { t.kind = 10; break; } case 8: { t.kind = 11; break; } case 9: { t.kind = 12; break; } case 10: { t.kind = 24; break; } case 11: { t.kind = 25; break; } case 12: { t.kind = 26; break; } case 13: if (ch == '=') { AddCh(); goto case 14; } else { goto case 0; } case 14: { t.kind = 27; break; } case 15: { t.kind = 28; break; } case 16: { t.kind = 29; break; } case 17: { t.kind = 30; break; } case 18: { t.kind = 31; break; } case 19: { t.kind = 33; break; } case 20: { t.kind = 34; break; } case 21: recEnd = pos; recKind = 8; if (ch == '=') { AddCh(); goto case 15; } else { t.kind = 8; break; } } t.val = new String(tval, 0, tlen); return(t); }