NFA NFA::createOptionalNFA(const NFA &a) { NFA result; result.initialize(a.states.count() + 2); int baseIdxA = 1; int initialA = a.initialState + baseIdxA; int finalA = a.finalState + baseIdxA; result.copyFrom(a, baseIdxA); result.addTransition(result.initialState, Epsilon, initialA); result.addTransition(result.initialState, Epsilon, result.finalState); result.addTransition(finalA, Epsilon, initialA); result.addTransition(finalA, Epsilon, result.finalState); return result; }