TerminatorScanner.java

package org.sterling.source.scanner;

import static java.lang.Character.isWhitespace;
import static org.sterling.source.scanner.ScannerUtil.unexpectedInput;

import org.sterling.SterlingException;
import org.sterling.source.syntax.NodeKind;
import org.sterling.source.syntax.Token;

public class TerminatorScanner implements ScannerDelegate {

    @Override
    public boolean expect(NodeKind kind, InputReader reader) {
        skipWhitespace(reader);
        boolean expected = reader.expect('\n') || reader.expect(';');
        reader.reject();
        return expected;
    }

    @Override
    public Token require(NodeKind kind, InputReader reader) throws SterlingException {
        if (expect(kind, reader)) {
            skipWhitespace(reader);
            reader.store();
            return reader.accept(kind);
        }
        throw unexpectedInput(reader, kind);
    }

    private void skipWhitespace(InputReader reader) {
        while (isWhitespace(reader.peek()) && !reader.expect('\n')) {
            reader.skip();
        }
    }
}