Beispiel #1
0
 public void Action(MathParserTreeNode treeNode)
 {
     if (treeNode.Operation == Operation.NoOperation)
     {
         return;
     }
     _polish[_index++] = treeNode.Operation;
 }
 /// <summary>
 /// Visit all nodes in the binary tree.
 /// </summary>
 /// <param name="visitor">Visitor</param>
 /// <param name="curNode">Current node</param>
 protected virtual void Visit(IVisitor visitor, MathParserTreeNode curNode)
 {
     if (curNode != null)
     {
         if (curNode.Left != null)
         {
             Visit(visitor, curNode.Left);
         }
         if (curNode.Right != null)
         {
             Visit(visitor, curNode.Right);
         }
         visitor.Action(curNode);
     }
 }
Beispiel #3
0
 /// <summary>
 /// Add left child.
 /// </summary>
 /// <param name="left">Child to be added</param>
 public void AddLeftChild(MathParserTreeNode left)
 {
     this._left = left;
 }
Beispiel #4
0
 /// <summary>
 /// Add right child.
 /// </summary>
 /// <param name="right">Child to be added</param>
 public void AddRightChild(MathParserTreeNode right)
 {
     this._right = right;
 }
Beispiel #5
0
 /// <summary>
 /// Add children to the current node
 /// </summary>
 /// <param name="right">Right node</param>
 /// <param name="left">Left node</param>
 public void AddChildren(MathParserTreeNode left, MathParserTreeNode right)
 {
     this._right = right;
     this._left  = left;
 }
Beispiel #6
0
 public void Action(MathParserTreeNode treeNode)
 {
     _count++;
 }
Beispiel #7
0
        /// <summary>
        /// Perform semantic transform of the introduced expression. Check if the expression is valid and build BinaryTree needed for polish postfix expression.
        /// </summary>
        /// <exception cref="MathParserException">MathParserException</exception>
        protected virtual void SemanticTransform()
        {
            _continueParsing = true;
            _binaryTree      = new MathParserBinaryTree(new MathParserTreeNode(Nonterminal.End));
            this._sizeOfPolishPostfixExpression = 0;    //initializing
            _indexOfChar = 0;
            if (_listOfDoubleInputs.Count != 0)
            {
                _listOfDoubleInputs.Clear();
            }
            if (_listOfVariableInputs.Count != 0)
            {
                _listOfVariableInputs.Clear();
            }
            //this._mathInput = this._mathInput.Trim() + "$"; //appeding the end-character
            this._binaryTree.Root.AddLeftChild(new MathParserTreeNode(Nonterminal.Expression)); //Expression$
            Stack <MathParserTreeNode> stack = new Stack <MathParserTreeNode>();

            stack.Push(this._binaryTree.Root); //$
            _traverseNode = this._binaryTree.Root.Left;
            stack.Push(_traverseNode);         //starting from Nonterminal.Expression

            while (_continueParsing)           //main cycle of parsing
            {
                _traverseNode = stack.Pop();
                switch (_traverseNode.Name)
                {
                case Nonterminal.Expression:
                    this.ExpressionToTermW(stack);
                    break;

                case Nonterminal.W:
                    this.WtoXWorEps(stack);
                    break;

                case Nonterminal.X:
                    this.XtoMinusTermOrXtoPlusTerm(stack);
                    break;

                case Nonterminal.Term:
                    this.TermToPowerK(stack);
                    break;

                case Nonterminal.K:
                    this.KtoYKorKtoEps(stack);
                    break;

                case Nonterminal.Y:
                    this.YtoMultiplyPowerOrYtoDividePower(stack);
                    break;

                case Nonterminal.Power:
                    this.PowerToFactoV(stack);
                    break;

                case Nonterminal.V:
                    this.VtoZVorVtoEps(stack);
                    break;

                case Nonterminal.Z:
                    this.ZtoPowerFactor(stack);
                    break;

                case Nonterminal.Factor:
                    this.Factor(stack);
                    break;

                case Nonterminal.ParenthesisClose:
                    this.ParanthesisClose(stack);
                    break;

                case Nonterminal.End:
                    this.End(stack);
                    break;

                case Nonterminal.AnyValue:
                    break;
                }
            }
        }
 /// <summary>
 /// Create binary tree object with specified root.
 /// </summary>
 /// <param name="root"></param>
 public MathParserBinaryTree(MathParserTreeNode root)
 {
     _root = root;
 }
 public MathParserBinaryTree()
 {
     _root = new MathParserTreeNode(Nonterminal.NoValue);
 }