protected <STATE, TOKEN> StateAliasNfa<TOKEN> createNfa(Nfa<STATE> nfa, Function<STATE, TOKEN> state2token) { HashMap<STATE, StateAlias<TOKEN>> cache = Maps.<STATE, StateAlias<TOKEN>> newLinkedHashMap(); StateAlias<TOKEN> stop = null; if (nfa.getStart() != nfa.getStop()) { stop = new StateAlias<TOKEN>(new ElementAlias<TOKEN>(state2token.apply(nfa.getStop()))); cache.put(nfa.getStop(), stop); } StateAlias<TOKEN> start = toAlias(nfa, state2token, nfa.getStart(), cache); if (nfa.getStart() == nfa.getStop()) { stop = new StateAlias<TOKEN>(start.getElement()); for (StateAlias<TOKEN> in : start.getIncoming()) { stop.getIncoming().add(in); in.getOutgoing().add(stop); in.getOutgoing().remove(start); } start.getIncoming().clear(); } StateAliasNfa<TOKEN> states = new StateAliasNfa<TOKEN>(start, stop); return states; }
boolean changed = true; while (!states.getStart().getOutgoing().isEmpty() && changed) { while (!states.getStart().getOutgoing().isEmpty() && changed) { changed = createAlternative(states); changed |= createMany(states.getStart(), Sets.<StateAlias<TOKEN>> newHashSet()); changed |= createGroups(states.getStart(), Sets.<StateAlias<TOKEN>> newHashSet()); changed |= mergeOptionalIntoMany(states.getStart(), Sets.<StateAlias<TOKEN>> newHashSet()); changed |= mergeAlternativeMultiples(states.getStart(), Sets.<StateAlias<TOKEN>> newHashSet()); if (!states.getStart().getOutgoing().isEmpty()) { Pair<Integer, StateAlias<TOKEN>> splitState = findSplitState(states.getStart(), 0, Sets.<StateAlias<TOKEN>> newHashSet()); if (splitState != null) { AbstractElementAlias<TOKEN> root = states.getStart().getElement(); if (excludeStartAndStop) { root = removeStartAndStop(nfa, state2token, root);
boolean changed = true; while (!states.getStart().getOutgoing().isEmpty() && changed) { while (!states.getStart().getOutgoing().isEmpty() && changed) { changed = createAlternative(states); changed |= createMany(states.getStart(), Sets.<StateAlias<TOKEN>> newHashSet()); changed |= createGroups(states.getStart(), Sets.<StateAlias<TOKEN>> newHashSet()); if (!states.getStart().getOutgoing().isEmpty()) { Pair<Integer, StateAlias<TOKEN>> splitState = findSplitState(states.getStart(), 0, Sets.<StateAlias<TOKEN>> newHashSet()); if (splitState != null) { AliasGrammarProvider<TOKEN> production = new AliasGrammarProvider<TOKEN>(states.getStart().getElement()); return new ProductionUtil().clone(production, grammarFactory);
protected <STATE, TOKEN> StateAliasNfa<TOKEN> createNfa(Nfa<STATE> nfa, Function<STATE, TOKEN> state2token) { HashMap<STATE, StateAlias<TOKEN>> cache = Maps.<STATE, StateAlias<TOKEN>> newHashMap(); StateAlias<TOKEN> stop = null; if (nfa.getStart() != nfa.getStop()) { stop = new StateAlias<TOKEN>(new ElementAlias<TOKEN>(state2token.apply(nfa.getStop()))); cache.put(nfa.getStop(), stop); } StateAlias<TOKEN> start = toAlias(nfa, state2token, nfa.getStart(), cache); if (nfa.getStart() == nfa.getStop()) { stop = new StateAlias<TOKEN>(start.getElement()); for (StateAlias<TOKEN> in : start.getIncoming()) { stop.getIncoming().add(in); in.getOutgoing().add(stop); in.getOutgoing().remove(start); } start.getIncoming().clear(); } StateAliasNfa<TOKEN> states = new StateAliasNfa<TOKEN>(start, stop); return states; }