Exemple #1
0
        Node Expression()
        {
            // Expr := Term {('+' | '-') Term}

            Node      result = Term();
            TokenType token  = scanner.Token;

            if (token == TokenType.TokenPlus || token == TokenType.TokenMinus)
            {
                SumNode node = new SumNode(result);
                do
                {
                    scanner.Accept();
                    Node child = Term();
                    if (token == TokenType.TokenMinus)
                    {
                        child = new MultiNode(new NumberNode(new Number(-1)), child);
                    }
                    node.Children.Add(child);
                    token = scanner.Token;
                } while (token == TokenType.TokenPlus || token == TokenType.TokenMinus);

                result = node;
            }

            return(result);
        }
Exemple #2
0
        public override SimplifyResult Replace(out Node node)
        {
            if (Children.Count == 1)
            {
                node = Children[0];
                return(new SimplifyResult(true));
            }
            else if (Children.Count == 0)
            {
                node = new NumberNode(Number.One);
                return(new SimplifyResult(true));
            }

            foreach (Node n in Children)
            {
                if (typeof(NumberNode).IsInstanceOfType(n) && ((NumberNode)n).Value.N == 0)
                {
                    node = n;                     // zero
                    return(new SimplifyResult(true, true));
                }
                else if (typeof(SumNode).IsInstanceOfType(n))
                {
                    List <Node> l = new List <Node>();
                    foreach (Node child in ((SumNode)n).Children)
                    {
                        List <Node> ll = new List <Node>(Children);
                        for (int i = 0; i < ll.Count; i++)
                        {
                            if (ll[i] == n)
                            {
                                ll.RemoveAt(i);
                                break;
                            }
                        }
                        ll.Add(child);
                        l.Add(new MultiNode(ll));
                    }

                    node = new SumNode(l);
                    return(new SimplifyResult(true, true));
                }
            }

            node = null;
            return(new SimplifyResult(false));
        }