Exemplo n.º 1
0
        public PDAConfiguration checkStackAndCreateNewConfig(PDAConfiguration currentConfig, Queue <char> newWord, Connection transition)
        {
            Stack <char> newStack = new Stack <char>(new Stack <char>(currentConfig.Stack));
            Node         newNode  = transition.ToNode;

            if (currentConfig.Stack.Count > 0)
            {
                if (transition.PopStack == currentConfig.Stack.Peek())
                {
                    newStack.Pop();
                    if (transition.PushStack != '_' && transition.PushStack != '\0')
                    {
                        newStack.Push(transition.PushStack);
                    }
                    return(new PDAConfiguration(newStack, newNode, newWord, currentConfig.Depth + 1));
                }
            }

            if (transition.PopStack == '_')
            {
                if (transition.PushStack != '_' && transition.PushStack != '\0')
                {
                    newStack.Push(transition.PushStack);
                }
                return(new PDAConfiguration(newStack, newNode, newWord, currentConfig.Depth + 1));
            }
            else if (transition.PopStack == '\0')
            {
                return(new PDAConfiguration(newStack, newNode, newWord, currentConfig.Depth + 1));
            }
            return(null);
        }
Exemplo n.º 2
0
        public bool wordAcceptancePDA(char[] word)
        {
            Queue <PDAConfiguration> configurations = new Queue <PDAConfiguration>();

            configurations.Enqueue(new PDAConfiguration(new Stack <char>(), automata.nodes[0], new Queue <char>(word), 0));
            HashSet <string> oldConfigs = new HashSet <string>();

            while (configurations.Count != 0)
            {
                PDAConfiguration configuration = configurations.Dequeue();
                if (configuration.Word.Count == 0 & configuration.Stack.Count == 0 && configuration.Node.Final)
                {
                    return(true);
                }

                foreach (Connection trans in configuration.Node.Connections)
                {
                    PDAConfiguration newConfig = checkTransitionAndCreateNewConfig(configuration, trans);
                    if (newConfig != null && newConfig.Depth < 50)
                    {
                        string newConfigHashString = newConfig.CreateHashString();
                        if (!oldConfigs.Contains(newConfigHashString))
                        {
                            configurations.Enqueue(newConfig);
                            oldConfigs.Add(newConfigHashString);
                        }
                    }
                }
                //outcomment this for big performence increase
                configuration.print();
            }

            return(false);
        }
Exemplo n.º 3
0
        public PDAConfiguration checkTransitionAndCreateNewConfig(PDAConfiguration currentConfig, Connection transition)
        {
            Queue <char> newWord = new Queue <char>(currentConfig.Word);

            if (currentConfig.Word.Count > 0)
            {
                if (transition.Symbol == currentConfig.Word.Peek())
                {
                    newWord.Dequeue();
                    return(checkStackAndCreateNewConfig(currentConfig, newWord, transition));
                }
            }

            if (transition.Symbol == '_')
            {
                return(checkStackAndCreateNewConfig(currentConfig, newWord, transition));
            }
            return(null);
        }