package bjc.pratt.tokens; import java.util.Iterator; import bjc.data.MarkListIterator; /** * Simple token stream implementation * @author bjcul * * @param The key type * @param The value type */ public class SimpleTokenStream extends TokenStream { private final MarkListIterator> iter; private Token curr; private Token terminal; /** * Create a new token stream from a iterator. * * @param itr The iterator to use. * @param terminal The terminal token to use for end-of-stream * */ public SimpleTokenStream(final Iterator> itr, Token terminal) { this.iter = new MarkListIterator<>(itr); this.terminal = terminal; } @Override public Token current() { // Prime stream if necessary if (curr == null) return next(); return curr; } @Override public Token next() { if (iter.hasNext()) { curr = iter.next(); } else { curr = terminal; } return curr; } @Override public boolean hasNext() { return iter.hasNext(); } @Override public void mark() { iter.mark(); } @Override public void commit() { iter.commit(); if (!iter.hasMark()) { // No marks outstanding; we can release the previous state iter.reset(); } } @Override public void rollback() { iter.rollback(); curr = iter.current(); } @Override public boolean hasMark() { return iter.hasMark(); } }