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