/// <summary> /// Tokenizes <paramref name="expr"/>. /// </summary> /// <param name="expr">The expression.</param> /// <returns>Tokens found <paramref name="expr"/>.</returns> private List <string> Lexer(string expr) { var token = ""; var tokens = new List <string>(); expr = expr.Replace("+-", "-"); expr = expr.Replace("-+", "-"); expr = expr.Replace("--", "+"); for (var i = 0; i < expr.Length; i++) { var ch = expr[i]; if (char.IsWhiteSpace(ch)) { continue; } if (char.IsLetter(ch)) { if (i != 0 && (char.IsDigit(expr[i - 1]) || expr[i - 1] == ')')) { tokens.Add("*"); } token += ch; while (i + 1 < expr.Length && char.IsLetterOrDigit(expr[i + 1])) { token += expr[++i]; } tokens.Add(token); token = ""; } else if (char.IsDigit(ch)) { token += ch; while (i + 1 < expr.Length && (char.IsDigit(expr[i + 1]) || (expr[i + 1] >= 'a' && expr[i + 1] <= 'f') || (expr[i + 1] >= 'A' && expr[i + 1] <= 'F') || expr[i + 1] == '.')) { token += expr[++i]; } tokens.Add(token); token = ""; } else if (i + 1 < expr.Length && (ch == '-' || ch == '+') && char.IsDigit(expr[i + 1]) && (i == 0 || OperatorList.IndexOf(expr[i - 1].ToString(CultureInfo.InvariantCulture)) != -1 || (i - 1 > 0 && expr[i - 1] == '('))) { // if the above is true, then the token for that negative number will be "-1", not "-","1". // to sum up, the above will be true if the minus sign is in front of the number, but // at the beginning, for example, -1+2, or, when it is inside the brakets (-1). // NOTE: this works for + as well! token += ch; while (i + 1 < expr.Length && (char.IsDigit(expr[i + 1]) || expr[i + 1] == '.')) { token += expr[++i]; } tokens.Add(token); token = ""; } else if (ch == '(') { if (i != 0 && (char.IsDigit(expr[i - 1]) || char.IsDigit(expr[i - 1]) || expr[i - 1] == ')')) { if (tokens.Count > 0 && LocalFunctions.ContainsKey(tokens[tokens.Count - 1]) == true) { tokens.Add("("); } else { tokens.Add("*"); tokens.Add("("); } } else { tokens.Add("("); } } else { tokens.Add(ch.ToString()); } } return(tokens); }