slcom/slangc/parser/ScanWalker.sauce

116 lines
2.3 KiB
Plaintext
Raw Permalink Normal View History

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);
//}
}
}