예제 #1
0
        /// <summary>
        /// Filtert einen mathematischen Ausdruck oder Term.
        /// </summary>
        /// <param name="tokens">Ein Token-Iterator mit den einzelnen Teilen des mathematischen Ausdruckes</param>
        /// <param name="tokenizer">Der <see cref="MathExpressionTokenizer"/>, der den Term zuvor geparst hat.</param>
        /// <returns>Ein neuer Token-Iterator, der es ermöglicht über den gefilterten Term zu iterieren.</returns>
        public IEnumerable <Token> PostProcessTokens(IEnumerable <Token> tokens)
        {
            Queue <Token> lastTokens = new Queue <Token>(3);

            foreach (Token t in tokens)
            {
                lastTokens.Enqueue(t);

                if (lastTokens.Count == 3)
                {
                    Token t1 = lastTokens.Dequeue();
                    Token t2 = lastTokens.Dequeue();
                    Token t3 = lastTokens.Dequeue();

                    if (t1.Type == TokenType.Number && t2.Type == TokenType.DecimalSeparator && t3.Type == TokenType.Number)
                    {
                        yield return(MathExpressionTokenizer.GetModifiedToken(t1, t1.Value + t2.Value + t3.Value));
                    }
                    else
                    {
                        yield return(t1);

                        lastTokens.Enqueue(t2);
                        lastTokens.Enqueue(t3);
                    }
                }
            }

            while (lastTokens.Count > 0)
            {
                yield return(lastTokens.Dequeue());
            }
        }
예제 #2
0
 private Token GenerateTestToken(TokenType tt, string strValue)
 {
     if (tt == TokenType.Variable)
     {
         return(MathExpressionTokenizer.GetVariableToken(strValue));
     }
     return(MathExpressionTokenizer.GetModifiedToken(MathExpressionTokenizer.GetToken(tt), strValue));
 }
        /// <summary>
        /// Gruppiert aufeinanderfolgende Token.
        /// </summary>
        /// <param name="tokens">Potenziell zu gruppierende Token</param>
        /// <param name="tt">Typ der zu gruppierenden Token</param>
        /// <returns>Gefilterte Liste, in der aufeinanderfolgende Token des angegebenen Typs zu einem Token zusammengefasst worden sind.</returns>
        private IEnumerable <Token> GroupByType(IEnumerable <Token> tokens, TokenType tt)
        {
            Token lastToken = MathExpressionTokenizer.GetToken(TokenType.Unknown);

            foreach (Token t in tokens)
            {
                if (t.Type == tt && lastToken.Type == tt)
                {
                    lastToken = MathExpressionTokenizer.GetModifiedToken(t, lastToken.Value + t.Value);
                }
                else if (lastToken.Type == TokenType.Unknown)
                {
                    lastToken = t;
                }
                else
                {
                    yield return(lastToken);

                    lastToken = t;
                }
            }

            yield return(lastToken);
        }
        /// <summary>
        /// Filtert einen mathematischen Ausdruck oder Term.
        /// </summary>
        /// <param name="tokens">Ein Token-Iterator mit den einzelnen Teilen des mathematischen Ausdruckes</param>
        /// <param name="tokenizer">Der <see cref="MathExpressionTokenizer"/>, der den Term zuvor geparst hat.</param>
        /// <returns>Ein neuer Token-Iterator, der es ermöglicht über den gefilterten Term zu iterieren.</returns>
        public IEnumerable <Token> PostProcessTokens(IEnumerable <Token> tokens)
        {
            bool          bIsStart   = true;
            Queue <Token> lastTokens = new Queue <Token>(3);

            foreach (Token t in tokens)
            {
                lastTokens.Enqueue(t);

                if (lastTokens.Count == 2 && bIsStart)
                {
                    bIsStart = false;

                    Token t1 = lastTokens.Dequeue();
                    Token t2 = lastTokens.Dequeue();

                    if ((t1.Type == TokenType.Operator && (t1.Value == "-" || t1.Value == "+")) &&
                        t2.Type == TokenType.Number)
                    {
                        yield return(MathExpressionTokenizer.GetModifiedToken(t2, (t1.Value != "+" ? t1.Value : "") + t2.Value));
                    }
                    else
                    {
                        if (t1.Type == TokenType.Parenthesis && t1.Value == "(")
                        {
                            lastTokens.Enqueue(t1);
                        }
                        else
                        {
                            yield return(t1);
                        }
                        lastTokens.Enqueue(t2);
                    }
                }

                if (lastTokens.Count == 3)
                {
                    Token t1 = lastTokens.Dequeue();
                    Token t2 = lastTokens.Dequeue();
                    Token t3 = lastTokens.Dequeue();

                    if ((t1.Type == TokenType.Operator || (t1.Type == TokenType.Parenthesis && t1.Value == "(")) &&
                        (t2.Type == TokenType.Operator && (t2.Value == "-" || t2.Value == "+")) &&
                        t3.Type == TokenType.Number)
                    {
                        yield return(t1);

                        yield return(MathExpressionTokenizer.GetModifiedToken(t3, (t2.Value != "+" ? t2.Value : "") + t3.Value));
                    }
                    else

                    {
                        yield return(t1);

                        lastTokens.Enqueue(t2);
                        lastTokens.Enqueue(t3);
                    }
                }
            }

            while (lastTokens.Count > 0)
            {
                yield return(lastTokens.Dequeue());
            }
        }