private State<T> convertPattern(final State<T> sinkState) { final State<T> lastSink; final Quantifier quantifier = currentPattern.getQuantifier(); if (quantifier.hasProperty(Quantifier.QuantifierProperty.LOOPING)) { // if loop has started then all notPatterns previous to the optional states are no longer valid final State<T> sink = copyWithoutTransitiveNots(sinkState); final State<T> looping = createLooping(sink); if (!quantifier.hasProperty(Quantifier.QuantifierProperty.OPTIONAL)) { lastSink = createInitMandatoryStateOfOneOrMore(looping); } else { lastSink = createInitOptionalStateOfZeroOrMore(looping, sinkState); } } else if (quantifier.hasProperty(Quantifier.QuantifierProperty.TIMES)) { lastSink = createTimesState(sinkState, currentPattern.getTimes()); } else { lastSink = createSingletonState(sinkState); } addStopStates(lastSink); return lastSink; }