예제 #1
0
        //very Important function-=-Self Explainatory
        private void PopConnectPush()
        {
            ExpTreeNode Temp = OpStack.Pop();             //Get Top operator and associate the operands

            //Find here if the Operator is "="  - then dont make the Symbol InVALID--Give some value


            Temp._right = NodeStack.Pop();              //Get Left and right from NodeStck
            if (Temp._value.ToString() == "=")
            {
                ExpTreeNode TmpLeft = NodeStack.Pop();

                //Now this needs to be Symbol with no Sub tree
                if (TmpLeft._ndType != ExpTreeNode.NodeType.Symbol)
                {
                    ErrorException Er = new ErrorException("Operator = at the wrong Place Left Operand must be lvalue ");
                    throw Er;
                }
                if (TmpLeft._left == null || TmpLeft._right == null)
                {
                    TmpLeft._value = -1;                    //SYMBOL TO BE CALCULATED
                    Temp._left     = TmpLeft;
                    NodeStack.Push(Temp);                   // puch the sub tree on the stack
                    return;
                }
                else
                {
                    ErrorException Er = new ErrorException("Operator = at the Wrong Place Left Operand must be lvalue");
                    throw Er;
                }
            }
            Temp._left = NodeStack.Pop();
            NodeStack.Push(Temp);             // puch the sub tree on the stack
        }
예제 #2
0
		public bool SetExpression(string _exp)
		{
			//Clear the Previous Exp
			_exp_parser.Clear();
			//now Parse the Exp
			_exp_tree = _exp_parser.ParseExpression(_exp);
			return true;
		}
예제 #3
0
 public bool SetExpression(string _exp)
 {
     //Clear the Previous Exp
     _exp_parser.Clear();
     //Now Parse the Exp
     _exp_tree = _exp_parser.ParseExpression(_exp);
     return(true);
 }
예제 #4
0
        private double _evaluate_exp(ExpTreeNode n)
        {
            if (n == null)
            {
                ErrorException Er = new ErrorException("No Expression Tree to Evaluate ");
                throw Er;
            }
            double x, y;

            if (n._ndType == ExpTreeNode.NodeType.Operator)
            {
                x = _evaluate_exp(n._left);
                y = _evaluate_exp(n._right);
                return((_OpInst == null) ? ApplyOp(n._value.ToString(), x, y):_OpInst.ApplyOp(n._value.ToString(), x, y));
            }
            return(System.Convert.ToDouble(n._value));
        }
예제 #5
0
		private double _evaluate_exp(ExpTreeNode n)
		{
			if(n== null)
			{
				ErrorException Er = new ErrorException("No Expression Tree to Evaluate "); 
				throw Er;
			}
			double x,y;
			if (n._ndType == ExpTreeNode.NodeType.Operator)
			{
				
				x = _evaluate_exp(n._left);
				y = _evaluate_exp(n._right);
				return (_OpInst == null) ? ApplyOp(n._value.ToString(),x,y):_OpInst.ApplyOp(n._value.ToString(),x,y);
			}
			return (System.Convert.ToDouble(n._value)) ;

		}
예제 #6
0
		//not Implemented 

		public string  ReMakeExpression(ExpTreeNode Tree)
		{
			//Doing nothing right now
			return "";
		}
예제 #7
0
		public void Push(ExpTreeNode f)
		{
			data[top++] = f;			
		}
예제 #8
0
		public TreeStack(int size)
		{
			data = new ExpTreeNode[size];
			top  = 0;
		}
예제 #9
0
		//Parse Expression funtion main funtion 
		//Creating the Exp tree from the Infix Expression
		public ExpTreeNode ParseExpression(string exp)
		{
			//Check for the Expresiioon validity
			if(!Isvalid_Exp(exp))
			{
				//Throw an Error Saying Commas are not proper
				ErrorException Er = new ErrorException("Operators ( or ) are not at the right places"); 
				throw Er;
				//Is c# need this return after that -- i dont think so but anyway
				
			}
			//Fill ur _exp Variable will need that
			_exp =  exp;
			 
			NextToken();
			do
			{
				//The errors that might come would be from stack 
				//If that went wrong -- gone case -- What use rwould do
				//no USer specific Errors from this funtion
				switch(current)
				{
					case Token.Literal:
						//CreateLeafNode and push it on the stack
						ExpTreeNode LNode = new ExpTreeNode();
						LNode._value  = literal;
						LNode._ndType = ExpTreeNode.NodeType.Literal;  
						NodeStack.Push(LNode); 
						break;
					case Token.Operator:
						//pop the St 
						ExpTreeNode ONode = new ExpTreeNode();
						ONode._value = Curr_op;
						ONode._ndType = ExpTreeNode.NodeType.Operator;
						if(Curr_op == "(")
						{
							OpStack.Push(ONode); 
							break;
						}
						if(Curr_op == ")")
						{
							while("(" != (string)OpStack.Top._value)
							{
								PopConnectPush();
							}
							OpStack.Pop() ; //Throw away {{
							break;
						}

						if(OpStack.IsEmpty())
						{
							OpStack.Push(ONode); 
						}
						else if((string)OpStack.Top._value == "(")
						{
							OpStack.Push(ONode);
						}
						else if(Priority(OpStack.Top._value.ToString()) < Priority(ONode._value.ToString() ))
						{
							OpStack.Push(ONode);
						}
						else
						{
							while(true)
							{
								PopConnectPush();
								if(OpStack.IsEmpty() == true || (string)OpStack.Top._value == "(" || Priority(OpStack.Top._value.ToString() ) < Priority(ONode._value.ToString() ))
									break;	
							}
							OpStack.Push(ONode);
						}
						break;
					case Token.Symbol: 
						{
							ExpTreeNode SNode = new ExpTreeNode();
							SNode._symbol = symbol;
							SNode._ndType = ExpTreeNode.NodeType.Symbol;  
							NodeStack.Push(SNode); 
						}
						break;
					default:
						break;
				}
				
				
			}while(NextToken() != Token.Eof);

			while(OpStack.IsEmpty() == false)
			{
				PopConnectPush();
			}
			//Get the Top of the Node Stack thats the root
			return NodeStack.Top; 

		}
예제 #10
0
        //Not Implemented

        public string  ReMakeExpression(ExpTreeNode Tree)
        {
            //Doing nothing right now
            return("");
        }
예제 #11
0
 public void Push(ExpTreeNode f)
 {
     data[top++] = f;
 }
예제 #12
0
 public TreeStack(int size)
 {
     data = new ExpTreeNode[size];
     top  = 0;
 }
예제 #13
0
        //Parse Expression funtion main funtion
        //Creating the Exp tree from the Infix Expression
        public ExpTreeNode ParseExpression(string exp)
        {
            //Check for the Expresiioon validity
            if (!Isvalid_Exp(exp))
            {
                //Throw an Error Saying Commas are not proper
                ErrorException Er = new ErrorException("Operators ( or ) are not at the right places");
                throw Er;
                //Is c# need this return after that -- i dont think so but anyway
            }
            //Fill ur _exp Variable will need that
            _exp = exp;

            NextToken();
            do
            {
                //The errors that might come would be from stack
                //If that went wrong -- gone case -- What use rwould do
                //No USer specific Errors from this funtion
                switch (current)
                {
                case Token.Literal:
                    //CreateLeafNode and push it on the stack
                    ExpTreeNode LNode = new ExpTreeNode();
                    LNode._value  = literal;
                    LNode._ndType = ExpTreeNode.NodeType.Literal;
                    NodeStack.Push(LNode);
                    break;

                case Token.Operator:
                    //pop the St
                    ExpTreeNode ONode = new ExpTreeNode();
                    ONode._value  = Curr_op;
                    ONode._ndType = ExpTreeNode.NodeType.Operator;
                    if (Curr_op == "(")
                    {
                        OpStack.Push(ONode);
                        break;
                    }
                    if (Curr_op == ")")
                    {
                        while ("(" != (string)OpStack.Top._value)
                        {
                            PopConnectPush();
                        }
                        OpStack.Pop();                                  //Throw away {{
                        break;
                    }

                    if (OpStack.IsEmpty())
                    {
                        OpStack.Push(ONode);
                    }
                    else if ((string)OpStack.Top._value == "(")
                    {
                        OpStack.Push(ONode);
                    }
                    else if (Priority(OpStack.Top._value.ToString()) < Priority(ONode._value.ToString()))
                    {
                        OpStack.Push(ONode);
                    }
                    else
                    {
                        while (true)
                        {
                            PopConnectPush();
                            if (OpStack.IsEmpty() == true || (string)OpStack.Top._value == "(" || Priority(OpStack.Top._value.ToString()) < Priority(ONode._value.ToString()))
                            {
                                break;
                            }
                        }
                        OpStack.Push(ONode);
                    }
                    break;

                case Token.Symbol:
                {
                    ExpTreeNode SNode = new ExpTreeNode();
                    SNode._symbol = symbol;
                    SNode._ndType = ExpTreeNode.NodeType.Symbol;
                    NodeStack.Push(SNode);
                }
                break;

                default:
                    break;
                }
            }while(NextToken() != Token.Eof);

            while (OpStack.IsEmpty() == false)
            {
                PopConnectPush();
            }
            //Get the Top of the Node Stack thats the root
            return(NodeStack.Top);
        }