Exemplo n.º 1
0
        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),
                                    });
                                }
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }