public string[] Generate() { List <string> generatedString = new List <string>(); var results = new HashSet <PDAResult>(); string[] startStackArray = new string[] { initialStackSymbol }; var condition = new PDACondition(new Stack <string>(), new Stack <string>(startStackArray), 0); while (true) { var nextTransitions = FindNextTransitionsForGenerating(condition); if (nextTransitions.Any()) { int index = random.Next(0, nextTransitions.Count()); var nextTransition = nextTransitions.ElementAt(index); if (nextTransition.readFromInput != "") { generatedString.Add(nextTransition.readFromInput); condition.currentInput.Push(nextTransition.readFromInput); } condition = ApplyTransition(nextTransition, condition); } else { break; } } return(generatedString.ToArray()); }
private static PDACondition ApplyTransition(PDATransition transition, PDACondition condition) { var newCurrentInput = new Stack <string>(new Stack <string>(condition.currentInput)); var newStack = new Stack <string>(new Stack <string>(condition.stack)); //We always pop something from stack newStack.Pop(); //If we should read something from input, we remove it from current input if (transition.readFromInput != "") { newCurrentInput.Pop(); } //Pushing elements to stack foreach (string elementToPush in transition.pushToStack.Reverse()) { if (elementToPush != "") { newStack.Push(elementToPush); } } return(new PDACondition(newCurrentInput, newStack, transition.nextState)); }
private IEnumerable <PDATransition> FindNextTransitionsForGenerating(PDACondition condition) { return(from transition in transitions where transition.IsSuitableForGenerating(condition) select transition); }
private IEnumerable <PDACondition> FindNextConditions(PDACondition condition) { return(from transition in transitions where transition.IsSuitable(condition) select ApplyTransition(transition, condition)); }
public bool IsSuitableForGenerating(PDACondition condition) { return(condition.stack.Count > 0 && condition.state == state && condition.stack.Peek() == popFromStack); }
public bool IsSuitable(PDACondition condition) { return((condition.stack.Count > 0 && condition.state == state && condition.stack.Peek() == popFromStack) && (readFromInput == "" || (condition.currentInput.Count > 0 && readFromInput == condition.currentInput.Peek()))); }