slcom/slangc/parser/SourceWalker.sauce

83 lines
1.7 KiB
Plaintext
Raw Permalink Normal View History

package slangc.parser;
/**
* Represents a moving point within a sourceFile file, i.e. the point currently being scanned.
* This is held in it's own class to make it easier for the scanner to be modified/reimplemented.
*
* @author Zak
*
*/
public final class SourceWalker {
private Source source;
private int index, line, character;
public SourceWalker(Source source, int index, int line, int character) {
reset(source, index, line, character);
}
public SourceWalker(Source source) {
reset(source);
}
public SourceWalker clone() {
return new SourceWalker(source, index, line, character);
}
public SourcePosition getPosition() {
return new SourcePosition(source, index, line, character);
}
public Source getSource() {
return source;
}
public int getIndex() {
return index;
}
public int getLineCount() {
return line;
}
public int getCharacterCount() {
return character;
}
public void reset(Source source, int index, int line, int character) {
this.source = source;
this.index = index;
this.line = line;
this.character = character;
}
public void reset(Source source) {
reset(source, 0, 1, 1);
}
public void reset() {
reset(source);
}
public boolean isAtEnd() {
return !source.isIndexWithinBounds(index);
}
public void advance() {
if (!isAtEnd()) {
if (source.getEncoding().isNewline(source.getCharacter(index))) {
line++;
character = 1;
} else {
character++;
}
index++;
}
}
public void advance(int numberOfCharacters) {
for (int i = 0; i < numberOfCharacters; i++) {
advance();
}
}
}