StaticTokenScanner.java

package org.sterling.source.scanner;

import static java.util.regex.Pattern.compile;
import static org.sterling.source.scanner.ScannerUtil.unexpectedInput;

import java.util.regex.Pattern;
import org.sterling.SterlingException;
import org.sterling.source.syntax.NodeKind;
import org.sterling.source.syntax.Token;

public class StaticTokenScanner implements ScannerDelegate {

    private final Pattern patterns;

    public StaticTokenScanner(String... values) {
        StringBuilder builder = new StringBuilder();
        builder.append("^(");
        builder.append(values[0]);
        for (int i = 1; i < values.length; i++) {
            builder.append('|');
            builder.append(values[i]);
        }
        builder.append(')');
        patterns = compile(builder.toString());
    }

    @Override
    public boolean expect(NodeKind kind, InputReader reader) {
        return reader.expect(patterns);
    }

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