Example #1
0
        private Token[] GetTokensInternal(string[] arr)
        {
            if (arr.Length == 0)
            {
                return(Array.Empty <Token>());
            }

            List <Token> tokens  = new List <Token>(arr.Length);
            IMathContext context = Context;
            int          length  = arr.Length;

            for (int i = 0; i < length; i++)
            {
                string current = arr[i];

                if (IsNumber(current))
                {
                    tokens.Add(new Token(current, TokenType.Number));
                }
                else if (context.IsVariableOrConstant(current))
                {
                    tokens.Add(new Token(current, TokenType.VariableOrConstant));
                }
                else if (context.IsFunction(current))
                {
                    tokens.Add(new Token(current, TokenType.Function));
                }
                else if (context.IsBinaryOperator(current) || context.IsUnaryOperator(current))
                {
                    string?prev = i > 0 ? arr[i - 1] : null;
                    string?next = i < length - 1 ? arr[i + 1] : null;

                    if (IsUnaryOperator(current, prev, next))
                    {
                        tokens.Add(new Token(current, TokenType.UnaryOperator));
                    }
                    else
                    {
                        tokens.Add(new Token(current, TokenType.BinaryOperator));
                    }
                }
                else if (current == "(" || current == ")")
                {
                    tokens.Add(Token.FromParenthesis(current[0]));
                }
                else if (current == ",")
                {
                    tokens.Add(Token.Comma);
                }
                else
                {
                    tokens.Add(new Token(current, TokenType.Unknown));
                }
            }

            return(tokens.ToArray());
        }