DoubleScanner.java

package org.sterling.source.scanner;

import static java.lang.Double.parseDouble;
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.DoubleToken;
import org.sterling.source.syntax.NodeKind;
import org.sterling.source.syntax.Token;

public class DoubleScanner implements ScannerDelegate {

    private final Pattern pattern;

    public DoubleScanner() {
        pattern = compile("^(?:0(?!\\d)|[1-9][0-9]*)?\\.[\\d]+");
    }

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

    @Override
    public Token require(NodeKind kind, InputReader reader) throws SterlingException {
        if (reader.store(pattern)) {
            Token token = reader.accept(kind);
            return new DoubleToken(token, parseDouble(token.getValue()));
        } else {
            throw unexpectedInput(reader, kind);
        }
    }
}