Exemplo n.º 1
0
                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();
                }
Exemplo n.º 2
0
                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());
                }