package com.fulmicoton.multiregexp;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Iterator;
public class Lexer<T extends Enum> {
private final ArrayList<T> types = new ArrayList<>() ;
private final ArrayList<String> patterns = new ArrayList<>();
private transient MultiPatternAutomaton automaton = null;
public Lexer<T> addRule(final T tokenType, final String pattern) {
this.types.add(tokenType);
this.patterns.add(pattern);
this.automaton = null;
return this;
}
public MultiPatternAutomaton getAutomaton() {
if (this.automaton == null) {
this.automaton = MultiPattern.of(patterns).makeAutomatonWithPrefix("");
}
return this.automaton;
}
public Scanner<T> scannerFor(final Reader reader) {
return new Scanner<T>(this.getAutomaton(), reader, this.types);
}
public Scanner<T> scannerFor(final CharSequence seq) {
return new Scanner<T>(this.getAutomaton(), seq, this.types);
}
public Iterable<Token<T>> scan(final CharSequence seq) {
final Scanner<T> scanner = this.scannerFor(seq);
scanner.nextUnchecked();
return new Iterable<Token<T>>() {
Token<T> next = Token.fromScanner(scanner);
@Override
public Iterator<Token<T>> iterator() {
return new Iterator<Token<T>>() {
@Override
public boolean hasNext() {
return next != null;
}
@Override
public Token<T> next() {
Token<T> buff = next;
if (scanner.nextUnchecked()) {
next = Token.fromScanner(scanner);
}
else {
next = null;
}
return buff;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
}