private static Token[] GetInfixTokens(string term) { //Leerzeichen entfernen und in Kleinbuchstaben konvertieren term = term.Replace(" ", string.Empty).ToLowerInvariant(); var tokens = new List<Token>(); //mit RegEx alle Zahlen aussortieren var numbers = parserRegEx.Matches(term); term = parserRegEx.Replace(term, "1"); var sb = new StringBuilder(term); //Term in Tokens teilen var numberIndex = 0; while (sb.Length > 0) { var validToken = false; //Zahlen prüfen if (sb.StartsWith("1")) { var t = new NumberToken(); t.ParseFromString(numbers[numberIndex].Groups["number"].Value); tokens.Add(t); numberIndex++; //term = ReduceString(term, 1); sb.Remove(0, 1); validToken = true; } //Operatoren prüfen if (!validToken) for (int i = 0; i < operators.Length; i++) { var token = operators[i]; if (sb.StartsWith(token)) { var t = new OperatorToken(); if ((token == '+' || token == '-') && (tokens.Count == 0 || tokens.Last().GetName() == "(")) //Vorzeichen { if (token == '-') t.ParseFromString("!"); } else t.ParseFromString(token.ToString()); tokens.Add(t); //term = ReduceString(term, 1); sb.Remove(0, 1); validToken = true; break; } } //Funktionen prüfen if (!validToken) for (int i = 0; i < functions.Length; i++) { var token = functions[i]; if (sb.StartsWith(token)) { var t = new FunctionToken(); t.ParseFromString(token); tokens.Add(t); //term = ReduceString(term, token.Length); sb.Remove(0, token.Length); validToken = true; break; } } //Rest prüfen if (!validToken) { if (sb.StartsWith("pi")) //Pi { var t = new NumberToken(); t.ParseFromString(System.Math.PI.ToString()); tokens.Add(t); //term = ReduceString(term, 2); sb.Remove(0, 2); } else if (sb.StartsWith("e")) //e { var t = new NumberToken(); t.ParseFromString(System.Math.E.ToString()); tokens.Add(t); //term = ReduceString(term, 1); sb.Remove(0, 1); } else if (sb.StartsWith("(")) //öffnende Klammer { var t = new SpecialToken(); t.ParseFromString("("); tokens.Add(t); //term = ReduceString(term, 1); sb.Remove(0, 1); } else if (sb.StartsWith(")")) //schließende Klammer { var t = new SpecialToken(); t.ParseFromString(")"); tokens.Add(t); //term = ReduceString(term, 1); sb.Remove(0, 1); } else if (sb.StartsWith(";")) //Argumenttrennzeichen { var t = new SpecialToken(); t.ParseFromString(";"); tokens.Add(t); //term = ReduceString(term, 1); sb.Remove(0, 1); } else //Token nicht bekannt throw new ArgumentException("Dieser Term enthält einen ungültigen Token."); } } return tokens.ToArray(); }
private static Token[] GetInfixTokens(string term) { //Leerzeichen entfernen und in Kleinbuchstaben konvertieren term = term.Replace(" ", string.Empty).ToLowerInvariant(); var tokens = new List <Token>(); //mit RegEx alle Zahlen aussortieren var numbers = parserRegEx.Matches(term); term = parserRegEx.Replace(term, "1"); var sb = new StringBuilder(term); //Term in Tokens teilen var numberIndex = 0; while (sb.Length > 0) { var validToken = false; //Zahlen prüfen if (sb.StartsWith("1")) { var t = new NumberToken(); t.ParseFromString(numbers[numberIndex].Groups["number"].Value); tokens.Add(t); numberIndex++; //term = ReduceString(term, 1); sb.Remove(0, 1); validToken = true; } //Operatoren prüfen if (!validToken) { for (int i = 0; i < operators.Length; i++) { var token = operators[i]; if (sb.StartsWith(token)) { var t = new OperatorToken(); if ((token == '+' || token == '-') && (tokens.Count == 0 || tokens.Last().GetName() == "(")) //Vorzeichen { if (token == '-') { t.ParseFromString("!"); } } else { t.ParseFromString(token.ToString()); } tokens.Add(t); //term = ReduceString(term, 1); sb.Remove(0, 1); validToken = true; break; } } } //Funktionen prüfen if (!validToken) { for (int i = 0; i < functions.Length; i++) { var token = functions[i]; if (sb.StartsWith(token)) { var t = new FunctionToken(); t.ParseFromString(token); tokens.Add(t); //term = ReduceString(term, token.Length); sb.Remove(0, token.Length); validToken = true; break; } } } //Rest prüfen if (!validToken) { if (sb.StartsWith("pi")) //Pi { var t = new NumberToken(); t.ParseFromString(System.Math.PI.ToString()); tokens.Add(t); //term = ReduceString(term, 2); sb.Remove(0, 2); } else if (sb.StartsWith("e")) //e { var t = new NumberToken(); t.ParseFromString(System.Math.E.ToString()); tokens.Add(t); //term = ReduceString(term, 1); sb.Remove(0, 1); } else if (sb.StartsWith("(")) //öffnende Klammer { var t = new SpecialToken(); t.ParseFromString("("); tokens.Add(t); //term = ReduceString(term, 1); sb.Remove(0, 1); } else if (sb.StartsWith(")")) //schließende Klammer { var t = new SpecialToken(); t.ParseFromString(")"); tokens.Add(t); //term = ReduceString(term, 1); sb.Remove(0, 1); } else if (sb.StartsWith(";")) //Argumenttrennzeichen { var t = new SpecialToken(); t.ParseFromString(";"); tokens.Add(t); //term = ReduceString(term, 1); sb.Remove(0, 1); } else //Token nicht bekannt { throw new ArgumentException("Dieser Term enthält einen ungültigen Token."); } } } return(tokens.ToArray()); }