Ejemplo n.º 1
0
        public void PushItemCountIs1()
        {
            var stack = new StackAsList <string>();

            stack.Push("test");
            Assert.AreEqual(1, stack.Count);
        }
Ejemplo n.º 2
0
        public void PushItemCanPeekItem()
        {
            var stack = new StackAsList <string>();

            stack.Push("test");
            Assert.AreEqual("test", stack.Peek());
        }
Ejemplo n.º 3
0
        public void PushTwoItemsPopTopItem()
        {
            var stack = new StackAsList <string>();

            stack.Push("test");
            stack.Push("other test");
            Assert.AreEqual("other test", stack.Pop());
        }
Ejemplo n.º 4
0
        public void PushTwoItemsCountIs2()
        {
            var stack = new StackAsList <string>();

            stack.Push("test");
            stack.Push("other test");
            Assert.AreEqual(2, stack.Count);
        }
Ejemplo n.º 5
0
        public void ClearListCantPopItem()
        {
            var stack = new StackAsList <string>();

            stack.Push("test");
            stack.Clear();
            stack.Pop();
        }
Ejemplo n.º 6
0
        public void ClearListResetsCountTo0()
        {
            var stack = new StackAsList <string>();

            stack.Push("test");
            stack.Clear();
            Assert.AreEqual(0, stack.Count);
        }
Ejemplo n.º 7
0
        public void StackOneItemCanIterate()
        {
            var stack = new StackAsList <string>();

            stack.Push("test");
            foreach (var item in stack)
            {
                Assert.AreEqual("test", item);
            }
        }
Ejemplo n.º 8
0
        public void PushTwoItemsPopRemainsSecond()
        {
            var stack = new StackAsList <string>();

            stack.Push("test");
            stack.Push("other test");
            stack.Pop();
            Assert.AreEqual(1, stack.Count);
            Assert.AreEqual("test", stack.Peek());
        }
Ejemplo n.º 9
0
        public void StackAddFiveItemsIterateInReverseOrder()
        {
            var stack = new StackAsList <int>();

            for (int i = 0; i < 5; i++)
            {
                stack.Push(i);
            }
            var num = 4;

            foreach (var item in stack)
            {
                Assert.AreEqual(num, item);
                num--;
            }
        }
Ejemplo n.º 10
0
        public void StackAddFiveItemsIterateCountRemains5()
        {
            var stack = new StackAsList <int>();

            for (int i = 0; i < 5; i++)
            {
                stack.Push(i);
            }
            var num = 4;

            foreach (var item in stack)
            {
                Assert.AreEqual(num, item);
                num--;
            }
            Assert.AreEqual(5, stack.Count);
        }
Ejemplo n.º 11
0
    private void GLR_Parse(List <Dictionary <string, List <Tuple <string, int, string> > > > parseTable, ref TreeNode productionTreeRoot)
    {
        List <StackAsList>     stacks     = new List <StackAsList>();
        List <StackAsList>     nextStacks = new List <StackAsList>();
        Dictionary <int, Node> active     = new Dictionary <int, Node>();
        StackAsList            root       = null;

        stacks.Add(new StackAsList(new Node(states[0], null, null))); //add start state
        int tokenIndex = 0;

        Stack <int>      stateStack = new Stack <int>();
        Stack <TreeNode> nodeStack  = new Stack <TreeNode>();

        stateStack.Push(0);

        bool notDone = true;

        try
        {
            while (notDone)
            {
                string sym;
                if (tokenIndex == tokens.Count)
                {
                    sym = "$";
                }
                else
                {
                    sym = tokens[tokenIndex].Symbol;
                }

                int  stackIndex = 0;
                Node refrence;
                if (stacks.Count == 0)
                {
                    throw new Exception("ERROR!! Stack is empty!!");
                }
                Console.WriteLine("Token{0} out of {1}: {2}", tokenIndex, tokens.Count, sym);
                while (stackIndex < stacks.Count) //reduce
                {
                    StackAsList stk = stacks[stackIndex];
                    refrence = stk.getTop();
                    int stateNumber = stk.getTopValue();
                    foreach (Tuple <string, int, string> action in parseTable[stateNumber][sym])
                    {
                        if (action.Item1 == "R")
                        {
                            Console.WriteLine("Action: {0}", action);
                            int    numPop = action.Item2;
                            string tSym   = action.Item3;

                            StackAsList stk2 = stk.clone();
                            stk2.pop(numPop);                               //reduce number of items
                            stk2.push(states[stk2.getTopValue()], new Tuple <string, Node, int, string>("R", refrence, numPop, sym));
                            if (!active.Contains(stk2.key()))
                            {
                                if (action.Item3 == "S'" || action.Item3 == "program")
                                {
                                    if (tokenIndex == tokens.Count && sym == "$")
                                    {
                                        root    = stk2;
                                        notDone = false;
                                        return;
                                    }
                                }
                                else
                                {
                                    active.Add(stk2.getTopValue(), stk2.getTop().nextNode);
                                    nextStacks.Add(stk2);
                                    stacks.Add(stk2);
                                }
                            }
                        }
                        else if (action.Item1 == "S")
                        {
                            if (!active.Contains(stk.key()))
                            {
                                nextStacks.Add(stk);
                                active.Add(stk.getTopValue(), stk.getTop().nextNode);
                            }
                        }
                    }
                    stackIndex++;
                }
                stackIndex = 0;
                var newNextStack = new List <StackAsList>();
                while (stackIndex < nextStacks.Count) //shift
                {
                    StackAsList stk         = nextStacks[stackIndex];
                    int         stateNumber = stk.getTopValue();
                    foreach (Tuple <string, int, string> action in parseTable[stateNumber][sym])
                    {
                        if (action.Item1 == "S")//shift
                        {
                            refrence = stk.getTop();
                            Console.WriteLine("\tNextAction: {0}", action);
                            StackAsList stk2 = stk.clone();
                            stk2.push(states[action.Item2], new Tuple <string, Node, int, string>("S", refrence, tokenIndex, ""));
                            newNextStack.Add(stk2);
                        }
                    }
                    stackIndex++;
                    stacks = nextStacks;
                }
                stacks     = newNextStack;
                nextStacks = new List <StackAsList>();
                tokenIndex++;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("--------------------------\nStacks:");
            printStackAsList(stacks);
            Console.WriteLine("--------------------------\nNextStacks:");
            printStackAsList(nextStacks);
            throw new Exception(e.Message);
        }

        List <Tuple <Tuple <string, Node, int, string>, Node> > actions = new List <Tuple <Tuple <string, Node, int, string>, Node> >();
        Node N = root.getTop();

        while (N.how != null)
        {
            actions.Add(new Tuple <Tuple <string, Node, int, string>, Node>(N.how, N));
            N = N.how.Item2;
        }

        Stack <TreeNode> treeNodeStack = new Stack <TreeNode>();

        for (int i = actions.Count - 1; i >= 0; i--)
        {
            Tuple <string, Node, int, string> how = actions[i].Item1;
            if (how.Item1 == "S")//shift
            {
                Token    token   = tokens[how.Item3];
                TreeNode newNode = new TreeNode(token.Symbol, token);
                treeNodeStack.Push(newNode);
            }
            else if (how.Item1 == "R")
            {
                int      numPop = how.Item3;
                string   tSym   = how.Item4;
                TreeNode node   = new TreeNode(tSym);
                while (numPop-- > 0)
                {
                    node.Children.Insert(0, treeNodeStack.Pop());
                }
                treeNodeStack.Push(node);
            }
        }
        productionTreeRoot = treeNodeStack.Peek();
    }
Ejemplo n.º 12
0
        public void CreateStackCountIs0()
        {
            var stack = new StackAsList <string>();

            Assert.AreEqual(0, stack.Count);
        }
Ejemplo n.º 13
0
        public void CreateCannotPeek()
        {
            var stack = new StackAsList <string>();

            stack.Peek();
        }