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); }
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); }
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); }