internal static PDA <char, char> ParsePDAFromXmlPDA(XElement xmlPDA)
        {
            var properties = xmlPDA.Elements().Where(el => el.Name.LocalName == XmlNames.Properties).First();

            var deterministic       = bool.Parse(properties.Elements().Where(el => el.Name.LocalName == XmlNames.Determinism).First().Value);
            var acceptanceCondition = AcceptanceCondition.GetAcceptanceConditionById(properties.Elements().Where(el => el.Name.LocalName == XmlNames.AcceptanceCondition).First().Value);

            var allStackSymbolsAsStrings = properties.Elements().Where(el => el.Name.LocalName == XmlNames.StackAlphabet).First().Elements().Select(s => s.Value).ToList();

            Assertion.Assert(allStackSymbolsAsStrings.All(s => s.Length == 1), "stack symbols must be chars");
            var allStackSymbols  = allStackSymbolsAsStrings.Select(s => s.First());
            var firstStackSymbol = allStackSymbols.First();
            //FIXME: what if all keys are used as stack symbols??

            var initialState = xmlPDA.Elements().Where(el => el.Name.LocalName == XmlNames.Nodes).First().Elements().Where(el => el.Name.LocalName == XmlNames.InitialState).First();

            Assertion.Assert(int.Parse(initialState.Attribute(XmlAttr.Id).Value) == PDA <char, char> .initialStateId, "the initial state has to have id " + PDA <char, char> .initialStateId);
            var initialStateIsFinal = bool.Parse(initialState.Attribute(XmlAttr.IsFinal).Value);
            var pda = new PDA <char, char>(acceptanceCondition, deterministic, firstStackSymbol, initialStateIsFinal, allStackSymbols, allStackAlphabetSymbols.First(k => !allStackSymbols.Contains(k)));

            AddStatesToPda(pda, xmlPDA);

            AddTransitionsToPda(pda, xmlPDA);

            return(pda);
        }
 public override AcceptanceCondition Clone()
 {
     return(AcceptanceCondition.GetAcceptanceConditionById(GetId()));
 }