Beispiel #1
0
        /// <summary>
        /// This method gets called when the token parser encounters a minus sign in front of a value.
        /// If the next token is a number, it will be changed to a negative number.
        /// If the next token is a funcion, param, or equation, an equation will be generated that multiplies the result by -1
        /// </summary>
        /// <returns>The negative token.</returns>
        /// <param name="tokenList">Token list.</param>
        /// <param name="curIndex">Current index.</param>
        /// <param name="owner">Owner.</param>
        public static BaseNode ParseNegativeToken(List <Token> tokenList, ref int curIndex, Equation owner)
        {
            //verify that this is not the last token
            if (curIndex >= (tokenList.Count - 1))
            {
                throw new FormatException("Can't end an equation with an operator");
            }

            //check that the token is a minus sign
            if ("-" != tokenList[curIndex].TokenText)
            {
                throw new FormatException("Expected a value, but found an invalid operator instead: " + tokenList[curIndex].TokenText);
            }

            //skip past the minus sign so we can get to the next token
            curIndex++;

            //create a number node, parse the next token into it
            BaseNode valueNode = BaseNode.ParseValueNode(tokenList, ref curIndex, owner);

            Debug.Assert(null != valueNode); //TODO: throw exceptions

            //what did we get back?
            if (valueNode is NumberNode)
            {
                //the next node is a number, multiply it by minus one
                NumberNode myNumberNode = valueNode as NumberNode;
                myNumberNode.NumberValue *= -1.0f;
            }
            else
            {
                //ok the node was a function, param, or equation

                //create another equation to multiply that resdult by -1
                NumberNode negativeOne = new NumberNode();
                negativeOne.NumberValue = -1.0f;
                OperatorNode multiplyNode = new OperatorNode();
                multiplyNode.Operator = '*';

                //string it all together
                negativeOne.AppendNextNode(multiplyNode);
                multiplyNode.AppendNextNode(valueNode);

                //put that into an equation node and treeify it
                EquationNode myEquationNode = new EquationNode();
                myEquationNode.SubEquation = negativeOne.Treeify();
                Debug.Assert(null != myEquationNode.SubEquation); //TODO: throw exceptions

                //set our result to the whole equation
                valueNode = myEquationNode;
            }

            //return it as the result
            return(valueNode);
        }
Beispiel #2
0
        /// <summary>
        /// Given a list of tokens and the index, get an operator node based on whatever is at that index.
        /// </summary>
        /// <returns>The oper node, or null if it hit the end of the equation.</returns>
        /// <param name="tokenList">Token list.</param>
        /// <param name="curIndex">Current index.</param>
        /// <param name="owner">the equation that this node is part of.  required to pull function delegates out of the dictionary</param>
        static protected BaseNode ParseOperNode(List <Token> tokenList, ref int curIndex, Equation owner)
        {
            if (null == tokenList)
            {
                throw new ArgumentNullException("tokenList");
            }
            if (null == owner)
            {
                throw new ArgumentNullException("owner");
            }
            Debug.Assert(curIndex < tokenList.Count); //TODO: throw exceptions

            //what kind of token do I have at that index?
            switch (tokenList[curIndex].TypeOfToken)
            {
            case TokenType.Operator:
            {
                //ok create an operator node
                OperatorNode operNode = new OperatorNode();

                //parse into that node
                operNode.ParseToken(tokenList, ref curIndex, owner);

                //return the thing
                return(operNode);
            }

            case TokenType.CloseParen:
            {
                //close paren, just eat it and return null.  It means this equation is finished parsing
                curIndex++;
                return(null);
            }

            default:
            {
                //should just be close paren nodes in here, which we should never get
                throw new FormatException("Expected a \"operator\" token, but got a " + tokenList[curIndex].TypeOfToken.ToString());
            }
            }
        }