116 lines
2.3 KiB
Plaintext
116 lines
2.3 KiB
Plaintext
|
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);
|
||
|
//}
|
||
|
}
|
||
|
}
|