コード例 #1
0
        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());
        }
コード例 #2
0
        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));
        }
コード例 #3
0
 private IEnumerable <PDATransition> FindNextTransitionsForGenerating(PDACondition condition)
 {
     return(from transition in transitions
            where transition.IsSuitableForGenerating(condition)
            select transition);
 }
コード例 #4
0
 private IEnumerable <PDACondition> FindNextConditions(PDACondition condition)
 {
     return(from transition in transitions
            where transition.IsSuitable(condition)
            select ApplyTransition(transition, condition));
 }
コード例 #5
0
 public bool IsSuitableForGenerating(PDACondition condition)
 {
     return(condition.stack.Count > 0 && condition.state == state && condition.stack.Peek() == popFromStack);
 }
コード例 #6
0
 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())));
 }