Example #1
0
        private void WalkCreatingDfaDgml(DFAState dfaState)
        {
            if (!_markedStates.Add(dfaState.StateNumber))
            {
                return;
            }

            // first add this node
            string nodeCategory;

            if (dfaState.IsAcceptState)
            {
                nodeCategory = Categories.StopState;
            }
            else
            {
                nodeCategory = Categories.State;
            }

            XElement node = new XElement(Elements.Node,
                                         new XAttribute(Attributes.Id, "state_" + dfaState.StateNumber),
                                         new XAttribute(Attributes.Label, GetStateLabel(dfaState)),
                                         new XAttribute(Attributes.Category, nodeCategory));

            _nodes.Add(dfaState, node);
            if (GroupNodes)
            {
                _extraLinks.Add(CreateContainmentLink(_groupId, "state_" + dfaState.StateNumber));
            }

            // make an edge for each transition
            for (int i = 0; i < dfaState.NumberOfTransitions; i++)
            {
                Transition edge = dfaState.GetTransition(i);
                if (StripNonreducedStates)
                {
                    DFAState target = edge.Target as DFAState;
                    // don't generate nodes for terminal states
                    if (target != null && target.AcceptStateReachable != Reachable.Yes)
                    {
                        continue;
                    }
                }

                string   edgeCategory = Categories.Edge;
                XElement edgeElement  = new XElement(Elements.Link,
                                                     new XAttribute(Attributes.Source, "state_" + dfaState.StateNumber),
                                                     new XAttribute(Attributes.Target, "state_" + edge.Target.StateNumber),
                                                     new XAttribute(Attributes.Category, edgeCategory),
                                                     new XAttribute(Attributes.Label, GetEdgeLabel(edge)));

                _links.Add(new KeyValuePair <State, Transition>(dfaState, edge), edgeElement);
                WalkCreatingDfaDgml((DFAState)edge.Target);
            }
        }