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); } }