package org.shedlang.compiler.tokeniser; import org.zwobble.sourcetext.SourcePosition; import java.util.List; public class TokenIterator { private final InfinitelyPaddedIterator> tokens; public TokenIterator(List> tokens, Token end) { this.tokens = new InfinitelyPaddedIterator<>(tokens, end); } public void skip(TTokenType tokenType) { nextValue(tokenType); } public Token next(TTokenType tokenType) { var token = tokens.get(); if (token.tokenType().equals(tokenType)) { tokens.moveNext(); return token; } else { throw new UnexpectedTokenException( tokenType.toString(), token ); } } public String nextValue(TTokenType tokenType) { return this.next(tokenType).value().toString(); } public boolean isNext(TTokenType tokenType) { return tokens.get().tokenType().equals(tokenType); } public boolean isNext(TTokenType tokenType1, TTokenType tokenType2) { return tokens.get().tokenType().equals(tokenType1) && tokens.get(1).tokenType().equals(tokenType2); } public boolean trySkip(TTokenType tokenType) { if (isNext(tokenType)) { tokens.moveNext(); return true; } else { return false; } } public Token peek() { return tokens.get(); } public Token peek(int offset) { return tokens.get(offset); } public SourcePosition startPosition() { return tokens.get().sourceRange().start(); } public SourcePosition endPosition() { if (tokens.isAtStart()) { return startPosition(); } else { return tokens.get(-1).sourceRange().end(); } } }