package slangc.parser; public final class ScanWalker { private Scan scan; private int index; public ScanWalker(Scan scan, int index) { reset(scan, index); } private ScanWalker() { } public ScanWalker(Scan scan) { reset(scan); } public Scan getScan() { return scan; } public int getIndex() { return index; } public void reset(ScanWalker from) { reset(from.getScan(), from.getIndex()); } public void reset(Scan scan, int index) { if (scan.countTokens() < 1) { throw new Error("This scan is empty"); } this.scan = scan; this.index = index; cachedToken = null; } public void reset(Scan scan) { reset(scan, 0); } public void reset() { reset(scan); } Token cachedToken = null; public void advance() { cachedToken = null; //if (!isAtEnd()) { index++; //} } public void advance(int n) { for (int i = 0; i < n; i++) { advance(); } } public static ScanWalker[] walkerCache = new ScanWalker[1000]; public static int walkerCount = 0; public static ScanWalker alloc() { if (walkerCount > 0) { walkerCount--; return walkerCache[walkerCount]; } else { return new ScanWalker(); } } public static void recycle(ScanWalker w) { if (walkerCount < 1000) { walkerCache[walkerCount] = w; walkerCount++; } } public ScanWalker clone() { ScanWalker w = alloc(); w.reset(this); return w; //return new ScanWalker(scan, index); } public boolean isAtEnd() { if (cachedToken == null) { return index >= scan.countTokens(); } else { return false; } //return cachedToken == null && (index < 0 || index >= scan.countTokens()); } public Token peek() { /*if (isAtEnd()) { return null; } else {*/ if (cachedToken == null) { return cachedToken = scan.getToken(index); } return cachedToken; //} } public Token peekOffset(int i) { /*if (index + i < 0 || index + i >= scan.countTokens()) { return null; } else {*/ return scan.getToken(index + i); //} } }