public String dotFormat() { StringBuilder result = new StringBuilder(); result.Append("digraph NFA {").Append(Out.NL); result.Append("rankdir = LR").Append(Out.NL); for (int i = 0; i < numStates; i++) { if (isFinal[i] || isPushback[i]) { result.Append(i); } if (isFinal[i]) { result.Append(" [shape = doublecircle]"); } if (isPushback[i]) { result.Append(" [shape = box]"); } if (isFinal[i] || isPushback[i]) { result.Append(Out.NL); } } for (int i = 0; i < numStates; i++) { for (int input = 0; input < numInput; input++) { if (table[i][input] != null) { StateSetEnumerator states = table[i][input].states(); while (states.hasMoreElements()) { int s = states.nextElement(); result.AppendFormat("{0} -> {1}", i, s); result.AppendFormat(" [label=\"{0}\"]{1}", classes.ToString(input), Out.NL); } } } if (epsilon[i] != null) { StateSetEnumerator states = epsilon[i].states(); while (states.hasMoreElements()) { int s = states.nextElement(); result.AppendFormat("{0} -> {1} [style=dotted]{2}", i, s, Out.NL); } } } result.Append("}").Append(Out.NL); return(result.ToString()); }
public override String ToString() { StateSetEnumerator @enum = states(); StringBuilder result = new StringBuilder("{"); //$NON-NLS-1$ if (@enum.hasMoreElements()) { result.Append(@enum.nextElement()); //$NON-NLS-1$ } while (@enum.hasMoreElements()) { int i = @enum.nextElement(); result.Append(", ").Append(i); //$NON-NLS-1$ } result.Append("}"); //$NON-NLS-1$ return(result.ToString()); }
/** * Returns <code>true</code>, iff the specified set of states * contains a final state. * * @param set the set of states that is tested for final states. */ private bool containsFinal(StateSet set) { states.reset(set); while (states.hasMoreElements()) { if (isFinal[states.nextElement()]) { return(true); } } return(false); }
private int _dfaStart; // in nfa coordinates private void removeDead(int start) { // Out.debug("removeDead ("+start+")"); if (visited[start] || live[start]) { return; } visited[start] = true; // Out.debug("not yet visited"); if (closure(start).isElement(_end)) { live[start] = true; } // Out.debug("is final :"+live[start]); for (int i = 0; i < numInput; i++) { StateSet nextState = closure(table[start][i]); StateSetEnumerator states = nextState.states(); while (states.hasMoreElements()) { int next = states.nextElement(); if (next != start) { removeDead(next); if (live[next]) { live[start] = true; } else { table[start][i] = null; } } } } StateSet _nextState = closure(epsilon[start]); StateSetEnumerator _states = _nextState.states(); while (_states.hasMoreElements()) { int next = _states.nextElement(); if (next != start) { removeDead(next); if (live[next]) { live[start] = true; } } } // Out.debug("state "+start+" is live :"+live[start]); }
/** * Returns an DFA that accepts the same language as this NFA. * This DFA is usualy not minimal. */ public DFA getDFA() { Hashtable dfaStates = new PrettyHashtable(numStates); ArrayList dfaVector = new PrettyArrayList(numStates); DFA dfa = new DFA(2 * numLexStates, numInput); int numDFAStates = 0; int currentDFAState = 0; Out.println("Converting NFA to DFA : "); epsilonFill(); StateSet currentState, newState; for (int i = 0; i < 2 * numLexStates; i++) { newState = epsilon[i]; dfaStates[newState] = new Integer(numDFAStates); dfaVector.Add(newState); dfa.setLexState(i, numDFAStates); dfa.setFinal(numDFAStates, containsFinal(newState)); dfa.setPushback(numDFAStates, containsPushback(newState)); dfa.setAction(numDFAStates, getAction(newState)); numDFAStates++; } numDFAStates--; if (Options.DEBUG) { Out.debug("DFA start states are :" + Out.NL + dfaStates + Out.NL + Out.NL + "ordered :" + Out.NL + dfaVector); } currentDFAState = 0; StateSet tempStateSet = NFA.tempStateSet; StateSetEnumerator states = NFA.states; // will be reused newState = new StateSet(numStates); while (currentDFAState <= numDFAStates) { currentState = (StateSet)dfaVector[currentDFAState]; for (char input = (char)0; input < numInput; input++) { // newState = DFAEdge(currentState, input); // inlining DFAEdge for performance: // Out.debug("Calculating DFAEdge for state set "+currentState+" and input '"+input+"'"); tempStateSet.clear(); states.reset(currentState); while (states.hasMoreElements()) { tempStateSet.add(table[states.nextElement()][input]); } newState.copy(tempStateSet); states.reset(tempStateSet); while (states.hasMoreElements()) { newState.add(epsilon[states.nextElement()]); } // Out.debug("DFAEdge is : "+newState); if (newState.containsElements()) { // Out.debug("DFAEdge for input "+(int)input+" and state set "+currentState+" is "+newState); // Out.debug("Looking for state set "+newState); Integer nextDFAState = (Integer)dfaStates[newState]; if (nextDFAState != null) { // Out.debug("FOUND!"); dfa.addTransition(currentDFAState, input, nextDFAState.intValue()); } else { if (Options.progress) { Out.print("."); } // Out.debug("NOT FOUND!"); // Out.debug("Table was "+dfaStates); numDFAStates++; // make a new copy of newState to store in dfaStates StateSet storeState = new StateSet(newState); dfaStates[storeState] = new Integer(numDFAStates); dfaVector.Add(storeState); dfa.addTransition(currentDFAState, input, numDFAStates); dfa.setFinal(numDFAStates, containsFinal(storeState)); dfa.setPushback(numDFAStates, containsPushback(storeState)); dfa.setAction(numDFAStates, getAction(storeState)); } } } currentDFAState++; } if (Options.verbose) { Out.println(""); } return(dfa); }