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