/// <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); }
/// <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); }
/// <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(); } } }