83 lines
1.7 KiB
Plaintext
83 lines
1.7 KiB
Plaintext
|
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();
|
||
|
}
|
||
|
}
|
||
|
}
|