private static void AddTransitionsToTM(XElement xmlTm, TMCB <int, string> tm, Dictionary <int, State <string> > idStateDict) { foreach (var link in xmlTm.Elements().Where(el => el.Name.LocalName == XmlNames.Links).First().Elements().Where(el => el.Name.LocalName == XmlNames.Link)) { var start = int.Parse(link.Attribute(XmlAttr.Start).Value); var target = int.Parse(link.Attribute(XmlAttr.End).Value); var startState = idStateDict[start]; var targetState = idStateDict[target]; foreach (var transitionXmlElement in link.Elements().Where(el => el.Name.LocalName == XmlNames.TransitionGroup).First().Elements().Where(el => el.Name.LocalName == XmlNames.Transition)) { var transitionsForTapes = transitionXmlElement.Value.Split('|'); var newTransition = new Transition <int, string>(); var i = 0; foreach (var t in transitionsForTapes) { var inputSymbol = ParseSymbol(t[0]); var outputSymbol = ParseSymbol(t[2]); var moveSymbol = t[4]; newTransition.AddReadCondition(i, inputSymbol); if (inputSymbol != outputSymbol) { newTransition.AddWriteAction(i, outputSymbol); } if (moveSymbol == 'R') { newTransition.AddMoveAction(i, Directions.Right); } if (moveSymbol == 'L') { newTransition.AddMoveAction(i, Directions.Left); } i++; } if (startState != targetState) { newTransition.TargetState = targetState; } tm.AddTransition(startState, newTransition); } } }
public static TMCB <int, string> ParseTMFromXml(XElement xmlTM) { var QandF = GetStates(xmlTM); var Q = QandF.Item1; var F = QandF.Item2; int blank = -1; var initialStateXml = xmlTM.Elements().Where(el => el.Name.LocalName == XmlNames.Nodes).First().Elements().Where(el => el.Name.LocalName == XmlNames.InitialState).First(); int initialStateId = int.Parse(initialStateXml.Attribute(XmlAttr.Id).Value); var initialState = new State <string>(initialStateId, initialStateId.ToString()); Q.Add(initialState); if (bool.Parse(initialStateXml.Attribute(XmlAttr.IsFinal).Value)) { F.Add(initialState); } var idStateDict = new Dictionary <int, State <string> >(); foreach (var q in Q) { idStateDict.Add(q.id, q); } var gammaAndSigma = ParseGammaAndSigma(xmlTM, blank); var gamma = gammaAndSigma.Item1; var sigma = gammaAndSigma.Item2; var tm = new TMCB <int, string>(Q, F, sigma, gamma, blank); tm.q0 = initialState; AddTransitionsToTM(xmlTM, tm, idStateDict); return(tm); }
static bool toTM(WExpr program) { TMCB <int, int> M = program.ToTMCB(-1); return(true); }