Beispiel #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);
        }
Beispiel #2
0
        Node SimpleFactor()
        {
            // SimpFactor := '(' Expr ')'
            //            or '|' Expr '|'
            //            or Number
            //            or Identifier
            //            or '-' Factor

            Node      result;
            TokenType token = scanner.Token;

            if (token == TokenType.TokenLParen)
            {
                scanner.Accept();
                result = Expression();
                if (scanner.Token == TokenType.TokenRParen)
                {
                    scanner.Accept();
                }
                else
                {
                    status = Status.Error;
                }
            }
            else if (token == TokenType.TokenTube)
            {
                scanner.Accept();
                result = new AbsoluteValueNode(Expression());
                if (scanner.Token == TokenType.TokenTube)
                {
                    scanner.Accept();
                }
                else
                {
                    status = Status.Error;
                }
            }
            else if (token == TokenType.TokenNumber)
            {
                result = new NumberNode(new Number(scanner.Number));
                scanner.Accept();
            }
            else if (token == TokenType.TokenIdentifer)
            {
                result = new UnknownNode(scanner.Symbol);
                scanner.Accept();
            }
            else if (token == TokenType.TokenMinus)
            {
                scanner.Accept();
                result = new MultiNode(new NumberNode(new Number(-1)), Factor());
            }
            else
            {
                status = Status.Error;
                result = null;
            }

            return(result);
        }
Beispiel #3
0
        public override SimplifyResult Replace(out Node node)
        {
            if (typeof(NumberNode).IsInstanceOfType(RChild))
            {
                node = new MultiNode(LChild, new NumberNode(new Number(1) / ((NumberNode)RChild).Value));
                return(new SimplifyResult(true, true));
            }

            // FIXME: because of DirectEqualsTo is no longer availible, we have to set up some new
            // NodeHelper.DirectEquals(), and NodeHelper.FindCommonFactor(a, b, out c).

            /*
             * if (typeof(UnknownNode).IsInstanceOfType(RChild))
             *      if (typeof(MultiNode).IsInstanceOfType(LChild))
             *      {
             *              MultiNode l = (MultiNode)LChild;
             *              UnknownNode r = (UnknownNode)RChild;
             *              l.Children.Remove(l.Children.First((x) =>
             *                              typeof(UnknownNode).IsInstanceOfType(x) && x.DirectEqualsTo(r)));
             *
             *              node = l;
             *              return true;
             *      }
             */

            node = null;
            return(new SimplifyResult(false));
        }
Beispiel #4
0
        public override SimplifyResult Replace(out Node node)
        {
            if (Children.Count == 0)
            {
                node = new NumberNode(Number.One);
                return(new SimplifyResult(true));
            }

            node = Children[0];
            for (int i = 1; i < Children.Count; i++)
            {
                if (Sign[i])
                {
                    node = new MultiNode(Children[i], node);
                }
                else
                {
                    node = new DivideNode(node, Children[i]);
                }
            }
            return(new SimplifyResult(true));
        }
Beispiel #5
0
        public override SimplifyResult Replace(out Node node)
        {
            if (typeof(NumberNode).IsInstanceOfType(RChild) ||
                ((NumberNode)RChild).Value.M == 1)
            {
                NumberNode n = (NumberNode)RChild;

                if (n.Value.N == 0)
                {
                    node = new NumberNode(Number.One);
                    return(new SimplifyResult(true));
                }
                else
                {
                    MultiNode result = new MultiNode();
                    long      x      = Math.Abs(n.Value.N);
                    for (long i = 0; i < x; i++)
                    {
                        result.Children.Add(LChild);
                    }

                    if (n.Value.N < 0)
                    {
                        node = new DivideNode(new NumberNode(Number.One), result);
                    }
                    else
                    {
                        node = result;
                    }
                    return(new SimplifyResult(true, true));
                }
            }
            else
            {
                node = null;
                return(new SimplifyResult(false));
            }
        }