/******************************************************************************* * Copyright (c) 2015 Bruno Medeiros and other Contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.lang.utils.parse; import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue; public interface IBasicCharSource<EXC extends Exception> { public static final int EOS = -1; /** @return the next character in the stream, without advancing the stream. */ int lookahead() throws EXC; /** @return the next character in the stream, advancing the stream. */ char consume() throws EXC; default char nextChar() throws EXC { return consume(); } void unread() throws EXC; default boolean lookaheadIsEOS() throws EXC { return !hasCharAhead(); } default boolean hasCharAhead() throws EXC { return lookahead() != EOS; } default char lookaheadChar() throws EXC { int la = lookahead(); assertTrue(la != EOS); return (char) la; } /* ----------------- ----------------- */ /** Read next character if it is equal to given character. @return true if a character was read. */ default boolean tryConsume(char character) throws EXC { if(lookahead() == character) { consume(); return true; } return false; } default boolean consumeAny() throws EXC { if(hasCharAhead()) { consume(); return true; } return false; } /** * Consume given amount of characters */ default void consumeAmount(int amount) throws EXC { while(amount-- > 0) { consume(); } } }