public Nfa<ISemState> getNFA(EObject context, EClass type) {
Pair<EObject, EClass> key = Tuples.create(context, type);
Nfa<ISemState> nfa = resultCache.get(key);
if (nfa != null)
return nfa;
NfaUtil util = new NfaUtil();
SynAbsorberNfaAdapter synNfa = new SynAbsorberNfaAdapter(pdaProvider.getPDA(context, type));
Map<ISynAbsorberState, Integer> distanceMap = util.distanceToFinalStateMap(synNfa);
nfa = util.create(util.sort(synNfa, distanceMap), new SemStateFactory());
if (type != null)
initContentValidationNeeded(type, nfa);
initRemainingFeatures(nfa.getStop(), util.inverse(nfa), Sets.<ISemState> newHashSet());
initOrderIDs(nfa);
resultCache.put(key, nfa);
return nfa;
}