コード例 #1
0
        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());
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        /**
         * 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);
        }
コード例 #4
0
        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]);
        }
コード例 #5
0
        /**
         * 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);
        }