/// <summary>
        /// Gets the next token while within an infix operation parse state.
        /// </summary>
        /// <param name="internalLine"></param>
        /// <param name="token"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        public override bool GetNextToken(string internalLine, out Token token, out TokenParseState state)
        {
            bool result = false;

            if ((result = PrefixFunctionToken.TryParse(internalLine, out token)))
            {
                state = new PrefixFunctionTokenParseState();
            }
            else if ((result = BooleanToken.TryParse(internalLine, out token) || ConstantToken.TryParse(internalLine, out token) || NumberToken.TryParse(internalLine, out token) || LastResultToken.TryParse(internalLine, out token)))
            {
                state = new ValueTokenParseState();
            }
            else if ((result = VariableToken.TryParse(internalLine, out token)))
            {
                state = new VariableTokenParseState();
            }
            else if ((result = (PerenthesisToken.TryParse(internalLine, out token) && ((PerenthesisToken)token).PerenthesisType == PerenthesisTokenType.Open)))
            {
                state = new PerenthesisTokenParseState();
            }
            else if ((result = CommentToken.TryParse(internalLine, out token)))
            {
                state = new NullTokenParseState();
            }
            else
            {
                state = new InvalidTokenParseState();
            }

            return(result);
        }
        /// <summary>
        /// Gets the next token while within a variable token parse state.
        /// </summary>
        /// <param name="internalLine"></param>
        /// <param name="token"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        public override bool GetNextToken(string internalLine, out Token token, out TokenParseState state)
        {
            bool result = false;

            if ((result = PerenthesisToken.TryParse(internalLine, out token) && ((PerenthesisToken)token).PerenthesisType == PerenthesisTokenType.Closed))
            {
                state = new PerenthesisTokenParseState();
            }
            else if ((result = InfixFunctionToken.TryParse(internalLine, out token) || ArithmeticOperatorToken.TryParse(internalLine, out token) || BinaryOperatorToken.TryParse(internalLine, out token) || BooleanOperatorToken.TryParse(internalLine, out token) || AssignmentOperatorToken.TryParse(internalLine, out token)))
            {
                state = new InfixOperationParseState();
            }
            else if ((result = PostfixFunctionToken.TryParse(internalLine, out token)))
            {
                state = new PostfixFunctionParseState();
            }
            else if ((result = CommentToken.TryParse(internalLine, out token)))
            {
                state = new NullTokenParseState();
            }
            else
            {
                state = new InvalidTokenParseState();
            }

            return(result);
        }
Example #3
0
        /// <summary>
        /// Gets the next token while in the set container token parse state.
        /// </summary>
        /// <param name="internalLine"></param>
        /// <param name="token"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        public override bool GetNextToken(string internalLine, out Token token, out TokenParseState state)
        {
            bool  result    = false;
            Token lastToken = CalculatorContext.GetInstance()[CalculatorContext.LastToken];

            if ((result = SetContainerToken.TryParse(internalLine, out token) && ((SetContainerToken)token).SetContainerType == ((SetContainerToken)lastToken).SetContainerType))
            {
                state = new SetContainerTokenParseState();
            }
            else if ((result = CommentToken.TryParse(internalLine, out token)))
            {
                state = new NullTokenParseState();
            }
            else if (((SetContainerToken)lastToken).SetContainerType == SetContainerTokenType.Open)
            {
                if ((result = PrefixFunctionToken.TryParse(internalLine, out token)))
                {
                    state = new PrefixFunctionTokenParseState();
                }
                else if ((result = BooleanToken.TryParse(internalLine, out token) || ConstantToken.TryParse(internalLine, out token) || NumberToken.TryParse(internalLine, out token) || LastResultToken.TryParse(internalLine, out token)))
                {
                    state = new ValueTokenParseState();
                }
                else if ((result = VariableToken.TryParse(internalLine, out token)))
                {
                    state = new VariableTokenParseState();
                }
                else
                {
                    state = new InvalidTokenParseState();
                }
            }
            else if ((result = InfixFunctionToken.TryParse(internalLine, out token) || ArithmeticOperatorToken.TryParse(internalLine, out token) || BinaryOperatorToken.TryParse(internalLine, out token) || BooleanOperatorToken.TryParse(internalLine, out token)))
            {
                state = new InfixOperationParseState();
            }
            else if ((result = PostfixFunctionToken.TryParse(internalLine, out token)))
            {
                state = new PostfixFunctionParseState();
            }
            else
            {
                state = new InvalidTokenParseState();
            }

            return(result);
        }
Example #4
0
        /// <summary>
        /// Parses tokens out of the string given.
        /// </summary>
        /// <param name="line"></param>
        private void ParseTokens(string line)
        {
            string          internalLine    = line;
            Regex           spaceRegex      = new Regex("^[\\s]+", RegexOptions.Compiled | RegexOptions.CultureInvariant);
            TokenParseState tokenParseState = new NullTokenParseState();

            while (!String.IsNullOrEmpty(internalLine))
            {
                Token token        = new NullToken();
                bool  tokenIsValid = false;

                if (spaceRegex.IsMatch(internalLine))
                {
                    int length = spaceRegex.Matches(internalLine)[0].Value.Length;

                    internalLine = RemoveToken(length, internalLine);
                }
                else
                {
                    tokenIsValid = tokenParseState.GetNextToken(internalLine, out token, out tokenParseState);

                    #region Old Conditional Code
                    //    if (lastToken is NullToken)
                    //    {
                    //        if (GetFirstToken(internalLine, out token))
                    //        {
                    //            tokenIsValid = true;
                    //        }
                    //        else if (InfixFunctionToken.TryParse(internalLine, out token)
                    //            || ArithmeticOperatorToken.TryParse(internalLine, out token)
                    //            || BinaryOperatorToken.TryParse(internalLine, out token)
                    //            || BooleanOperatorToken.TryParse(internalLine, out token)
                    //            || PostfixFunctionToken.TryParse(internalLine, out token))
                    //        {
                    //            _tokens.Add(CalculatorContext.GetInstance()[CalculatorContext.LastResult]);

                    //            lastToken = _tokens[0];
                    //        }
                    //        else
                    //        {
                    //            throw new InvalidTokenException(String.Format("Invalid or unrecognized token at {0}.", internalLine));
                    //        }
                    //    }
                    //    else if (lastToken is VariableToken)
                    //    {
                    //        if ((PerenthesisToken.TryParse(internalLine, out token) && ((PerenthesisToken)token).PerenthesisType == PerenthesisType.Closed)
                    //            || InfixFunctionToken.TryParse(internalLine, out token)
                    //            || ArithmeticOperatorToken.TryParse(internalLine, out token)
                    //            || BinaryOperatorToken.TryParse(internalLine, out token)
                    //            || BooleanOperatorToken.TryParse(internalLine, out token)
                    //            || PostfixFunctionToken.TryParse(internalLine, out token)
                    //            || AssignmentOperatorToken.TryParse(internalLine, out token)
                    //            || CommentToken.TryParse(internalLine, out token))
                    //        {
                    //            tokenIsValid = true;
                    //        }
                    //    }
                    //    else if (lastToken is NumberToken || lastToken is BooleanToken)
                    //    {
                    //        if ((PerenthesisToken.TryParse(internalLine, out token) && ((PerenthesisToken)token).PerenthesisType == PerenthesisType.Closed)
                    //            || InfixFunctionToken.TryParse(internalLine, out token)
                    //            || ArithmeticOperatorToken.TryParse(internalLine, out token)
                    //            || BinaryOperatorToken.TryParse(internalLine, out token)
                    //            || BooleanOperatorToken.TryParse(internalLine, out token)
                    //            || PostfixFunctionToken.TryParse(internalLine, out token)
                    //            || CommentToken.TryParse(internalLine, out token))
                    //        {
                    //            tokenIsValid = true;
                    //        }
                    //    }
                    //    else if (lastToken is PerenthesisToken)
                    //    {
                    //        if (PerenthesisToken.TryParse(internalLine, out token) && ((PerenthesisToken)token).PerenthesisType == ((PerenthesisToken)lastToken).PerenthesisType
                    //            || CommentToken.TryParse(internalLine, out token))
                    //        {
                    //            tokenIsValid = true;
                    //        }
                    //        else if (((PerenthesisToken)lastToken).PerenthesisType == PerenthesisType.Open)
                    //        {
                    //            if (PrefixFunctionToken.TryParse(internalLine, out token)
                    //                || BooleanToken.TryParse(internalLine, out token)
                    //                || VariableToken.TryParse(internalLine, out token)
                    //                || ConstantToken.TryParse(internalLine, out token)
                    //                || NumberToken.TryParse(internalLine, out token)
                    //                || LastResultToken.TryParse(internalLine, out token))
                    //            {
                    //                tokenIsValid = true;
                    //            }
                    //        }
                    //        else
                    //        {
                    //            if (InfixFunctionToken.TryParse(internalLine, out token)
                    //                || ArithmeticOperatorToken.TryParse(internalLine, out token)
                    //                || BinaryOperatorToken.TryParse(internalLine, out token)
                    //                || BooleanOperatorToken.TryParse(internalLine, out token)
                    //                || PostfixFunctionToken.TryParse(internalLine, out token))
                    //            {
                    //                tokenIsValid = true;
                    //            }
                    //        }
                    //    }
                    //    else if (lastToken is PrefixFunctionToken
                    //        && ((PerenthesisToken.TryParse(internalLine, out token) && ((PerenthesisToken)token).PerenthesisType == PerenthesisType.Open)
                    //            || lastToken.ToString().Equals("!", StringComparison.InvariantCultureIgnoreCase)
                    //                && (BooleanToken.TryParse(internalLine, out token)
                    //                || VariableToken.TryParse(internalLine, out token)
                    //                || ConstantToken.TryParse(internalLine, out token)
                    //                || NumberToken.TryParse(internalLine, out token))))
                    //    {
                    //        tokenIsValid = true;
                    //    }
                    //    else if (lastToken is InfixFunctionToken || lastToken is OperatorToken)
                    //    {
                    //        if (PrefixFunctionToken.TryParse(internalLine, out token)
                    //            || BooleanToken.TryParse(internalLine, out token)
                    //            || VariableToken.TryParse(internalLine, out token)
                    //            || ConstantToken.TryParse(internalLine, out token)
                    //            || NumberToken.TryParse(internalLine, out token)
                    //            || LastResultToken.TryParse(internalLine, out token)
                    //            || (PerenthesisToken.TryParse(internalLine, out token) && ((PerenthesisToken)token).PerenthesisType == PerenthesisType.Open)
                    //            || CommentToken.TryParse(internalLine, out token))
                    //        {
                    //            tokenIsValid = true;
                    //        }
                    //    }
                    //    else if (lastToken is PostfixFunctionToken)
                    //    {
                    //        if ((PerenthesisToken.TryParse(internalLine, out token) && ((PerenthesisToken)token).PerenthesisType == PerenthesisType.Closed)
                    //            || InfixFunctionToken.TryParse(internalLine, out token)
                    //            || ArithmeticOperatorToken.TryParse(internalLine, out token)
                    //            || BinaryOperatorToken.TryParse(internalLine, out token)
                    //            || BooleanOperatorToken.TryParse(internalLine, out token)
                    //            || PostfixFunctionToken.TryParse(internalLine, out token)
                    //            || CommentToken.TryParse(internalLine, out token))
                    //        {
                    //            tokenIsValid = true;
                    //        }
                    //    }
                    //    else
                    //    {
                    //        throw new InvalidTokenException(String.Format("Invalid or unrecognized token at {0}.", internalLine));
                    //    }
                    #endregion

                    if (tokenIsValid)
                    {
                        internalLine = AddTokenToCollection(token, internalLine);
                        _context[CalculatorContext.LastToken] = token;
                    }

                    CheckForLastResultImplication();
                }
            }
        }