public void AddType1AndType2Transitions(Automata automata, CFG cfg) { foreach (Node fromNode in automata.nodes) { foreach (Node toNode in automata.nodes) { CFGVariable transition = GetOrCreateNewTransition(fromNode, toNode, cfg.AllTransitions); //type 1 transitions if (fromNode == toNode) { transition.ToVariablesOrLetters.Add(new List <ILetterOrVariable>() { GetOrCreateNewSymbol('_', cfg) }); } //type 2 transitions foreach (Node betweenNode in automata.nodes) { if (betweenNode != fromNode && betweenNode != toNode) { transition.ToVariablesOrLetters.Add(new List <ILetterOrVariable>() { GetOrCreateNewTransition(fromNode, betweenNode, cfg.AllTransitions), GetOrCreateNewTransition(betweenNode, toNode, cfg.AllTransitions) }); } } } //type 3 transitions foreach (Connection conn in fromNode.Connections) { if (conn.PushStack != '_') { foreach (Node secondConnNode in automata.nodes) { foreach (Connection secondConn in secondConnNode.Connections) { if (secondConn.PopStack == conn.PushStack) { CFGVariable type3Transition = GetOrCreateNewTransition(fromNode, secondConn.ToNode, cfg.AllTransitions); type3Transition.ToVariablesOrLetters.Add(new List <ILetterOrVariable>() { GetOrCreateNewSymbol(conn.Symbol, cfg), GetOrCreateNewTransition(conn.ToNode, secondConnNode, cfg.AllTransitions), GetOrCreateNewSymbol(secondConn.Symbol, cfg), }); } } } } } } }
private CFGVariable GetOrCreateNewTransition(Node leftNode, Node rightNode, Dictionary <string, CFGVariable> allTransitions) { string key = $"{leftNode.Name}{rightNode.Name}"; if (allTransitions.ContainsKey(key)) { return(allTransitions[key]); } CFGVariable newTransition = new CFGVariable(leftNode, rightNode); allTransitions.Add(key, newTransition); return(newTransition); }
private List <List <ILetterOrVariable> > CreateNewEpsilonTransitions(List <ILetterOrVariable> currentTransition, CFGVariable epsilonVariable, CFG cfg) { List <List <ILetterOrVariable> > createNewEpsilonTransitions = new List <List <ILetterOrVariable> >(); List <int> locations = new List <int>(); for (int i = 0; i < currentTransition.Count; i++) { if (currentTransition[i] == epsilonVariable) { locations.Add(i); } } List <List <int> > combinations = PowerSet(locations); foreach (List <int> combination in combinations) { List <ILetterOrVariable> transitionCopy = new List <ILetterOrVariable>(currentTransition); foreach (int position in combination) { transitionCopy[position] = GetOrCreateNewSymbol('_', cfg); } createNewEpsilonTransitions.Add(transitionCopy); } return(createNewEpsilonTransitions); }