Laden...

Klammerregel bei String einhalten

Erstellt von digi333 vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.415 Views
D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 14 Jahren
Klammerregel bei String einhalten

ich brauche eine Funktion die Zusammenhänge von Klammern versteht um somit einen bestimmten String zuerhalten. Beispiel:


string test = "Ein Beispiel: (Diese Klammer (ist innen) und außen)";

// so nicht!
string[] out = test.Split(new string[] { "(", ")"}, StringSplitOptions.RemoveEmptyEntries);

// sondern
string out = "Diese Klammer (ist innen) und außen";

Er soll also verstehen, dass die letzte Klammer in diesem Beispiel zur ersten klammer gehört.

Gelöschter Account
vor 14 Jahren

das geht sehr gut mit einer for-schleife über dem string und einem conter, der bei öffnenden klammern hochzählt und bei schließenden klammern erunterzählt. dann hast du die position vom anfang und vom ende von korrekt gesetzten klammern.

1.346 Beiträge seit 2008
vor 14 Jahren

Ich habs in einem kompiler rekursiv gelöst. bei einer öffnenden ruft er rekursiv die methode auf und bei einer schließenden geht er aus der Methode. Das hat sehr gut funktioniert.

Gruß pdelvo

Gelöschter Account
vor 14 Jahren

rekursivität hat eine natürliche limitierung. die grenze ist zwar hoch aber sie ist je nach datenbestand auch ereichbar (im code aber eher unwahrscheinlich). zudem ist die for-schleife perfomanter, da sie kein methodenaufruf mit übergabeparametern durchgeführen muss.

1.346 Beiträge seit 2008
vor 14 Jahren

Ich hab das so gemacht, weil man dann sehr leicht eine baumstruktur erstellen kann. Das ist beim kompilieren praktisch.

Und ich glaube nicht, dass man mit solchen Texten arbeiten muss: Dies ( ist(eine(sehr(tief(verschachtelte(Klammer...))))))

Gruß pdelvo

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 14 Jahren

Und ich glaube nicht, dass man mit solchen Texten arbeiten muss: Dies ( ist(eine(sehr(tief(verschachtelte(Klammer...))))))

Danke für die Hinweise. Ich bekomme solche Texte und kann es mir leider nicht aussuchen.

1.346 Beiträge seit 2008
vor 14 Jahren

So 12.000 verschachtelte klammern solltest du schon mit meiner methode hinbekommen.

Gruß pdelvo

1.002 Beiträge seit 2007
vor 14 Jahren

Hallo pdelvo,

mal abgesehen davon lässt sich - wie JAck30lena gesagt hat - jede rekursive Form in eine iterative umschreiben.
Korrigiere mich, wenn ich meine, dass deine Lösung sogar endrekursiv ist?

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo m0rius,

Korrigiere mich, wenn ich meine, dass deine Lösung sogar endrekursiv ist?

also ich glaube das nicht.

herbivore

1.346 Beiträge seit 2008
vor 14 Jahren

Was sollte an meiner Lösung denn Endrekursiv sein?

Gruß pdelvo

1.002 Beiträge seit 2007
vor 14 Jahren

Hallo pdelvo,

du hast geschrieben, dass du Rekursion verwendet hast, um assoziierte Klammerpaare zu finden. Ich habe vermutet, dass deine rekursive Methode endrekursiv ist.
Magst du uns vielleicht mal deine Methode zeigen?

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

1.346 Beiträge seit 2008
vor 14 Jahren

Ist aber nur ein Teil davon. Vorher habe ich den Code noch gescannt und damit in seine einzelteile zerlegt. hier ist der teil, der den code 'versteht':

private List<AstTree> ParseTokens(List<object> tokens,ref int pointer)
        {
            var tree = new List<AstTree>();
            while (pointer < tokens.Count)
            {
                if (tokens[pointer].ToString() == "Namespace")
                {
                    pointer++;
                    var names = new Namespace {Name = tokens[pointer].ToString()};
                    pointer++;
                    if (Tokens.CurvedBrackedOpen.CompareTo(tokens[pointer]) != 0)
                    {
                        throw new Exception("'{' expected");
                    }
                    pointer++;
                    names.Elements = ParseTokens(tokens, ref pointer);
                    tree.Add(names);

                }
                else if (tokens[pointer] is Tokens && Tokens.CurvedBrackedClosed.CompareTo(tokens[pointer]) == 0)
                {
                    pointer++;
                    return tree;
                }
                else if (tokens[pointer].ToString() == "Class")
                {
                    pointer++;
                    var classo = new Class { Name = tokens[pointer].ToString() };
                    pointer++;

                    while (!(tokens[pointer] is Tokens))
                    {
                        classo.Modifier = classo.Modifier | ParseModifier(tokens[pointer].ToString());
                        pointer++;
                    }

                    if (!(tokens[pointer] is Tokens) || Tokens.CurvedBrackedOpen.CompareTo(tokens[pointer]) != 0)
                    {
                        throw new Exception("'{' expected");
                    }

                    pointer++;
                    classo.Elements = ParseClassTokens(tokens, ref pointer);
                    tree.Add(classo);
                }
            }

            return tree;
        }

Gruß pdelvo