private static void AddTransitionPushingOne(Transition <A, S> transition, SDA <A, TripleStackSymbol <S> > sda, PDA <A, S> dpda, Dictionary <string, TripleStackSymbol <S> > stackSymbols) { foreach (var r in dpda.States) { var stackSymbolIn = stackSymbols[TripleStackSymbol <S> .GetKey(transition.Origin.Id, transition.StackSymbolIn, r.Key)]; var stackSymbolsOut = new TripleStackSymbol <S>[] { stackSymbols[TripleStackSymbol <S> .GetKey(transition.Target.Id, transition.StackSymbolsWritten.First(), r.Key)] }; sda.AddTransition(transition.SymbolIn.GetSymbol(), stackSymbolIn, stackSymbolsOut); } }
private static Dictionary <string, TripleStackSymbol <S> > CreateStackSymbols(PDA <A, S> dpda) { var res = new Dictionary <string, TripleStackSymbol <S> >(); foreach (var state1 in dpda.States) { foreach (var stackSymbol in dpda.AllStackSymbols) { foreach (var state2 in dpda.States) { res.Add(TripleStackSymbol <S> .GetKey(state1.Key, stackSymbol, state2.Key), new TripleStackSymbol <S>(state1.Key, stackSymbol, state2.Key)); } } } return(res); }
private static IEnumerable <TripleStackSymbol <S> > RemoveEpsilonSymbolsFromRightHandSide(SDA <A, TripleStackSymbol <S> > sda, PDA <A, S> dpda, Dictionary <string, TripleStackSymbol <S> > stackSymbols) { var epsilonSymbols = new List <TripleStackSymbol <S> >(); var transitions = dpda.States.SelectMany(s => s.Value.Transitions).ToList(); foreach (var t in transitions.Where(t => t.SymbolIn.IsEmpty())) { var epsilonSymbol = stackSymbols[TripleStackSymbol <S> .GetKey(t.Origin.Id, t.StackSymbolIn, t.Target.Id)]; epsilonSymbols.Add(epsilonSymbol); foreach (var sdaTransition in sda.Transitions.Where(sdaTransition => sdaTransition.StackSymbolsWritten.Contains(epsilonSymbol))) { sdaTransition.RemoveEpsilonSymbol(epsilonSymbol); } } return(epsilonSymbols); }
private static IEnumerable <StackSymbolSequence <TripleStackSymbol <S> > > ConvertInitialConfigurationToSDAConfiguration(Dictionary <string, TripleStackSymbol <S> > allStackSymbols, Dictionary <string, TripleStackSymbol <S> > epsilonStackSymbols, PDA <A, S> dpda, S initialStackSymbol) { var res = new List <StackSymbolSequence <TripleStackSymbol <S> > >(); foreach (var s in dpda.States) { var tripleKey = TripleStackSymbol <S> .GetKey(dpda.InitialState.Id, initialStackSymbol, s.Key); if (allStackSymbols.ContainsKey(tripleKey)) { var triple = allStackSymbols[tripleKey]; res.Add(new StackSymbolSequence <TripleStackSymbol <S> >(triple)); } else if (epsilonStackSymbols.ContainsKey(tripleKey)) { res.Add(new StackSymbolSequence <TripleStackSymbol <S> >()); } } Assertion.Assert(res.All(s => s.StackSequence.Length > 0) || res.Count == 1, "if a configuration set contains the empty sequence (Epsilon), then it is only admissible if this is the only element"); return(res); }
private static void AddTransitionPushingNone(Transition <A, S> transition, SDA <A, TripleStackSymbol <S> > sda, Dictionary <string, TripleStackSymbol <S> > stackSymbols) { var stackSymbolIn = stackSymbols[TripleStackSymbol <S> .GetKey(transition.Origin.Id, transition.StackSymbolIn, transition.Target.Id)]; sda.AddTransition(transition.SymbolIn.GetSymbol(), stackSymbolIn); }