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.
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
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.
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
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.
So 12.000 verschachtelte klammern solltest du schon mit meiner methode hinbekommen.
Gruß pdelvo
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
Hallo m0rius,
Korrigiere mich, wenn ich meine, dass deine Lösung sogar endrekursiv ist?
also ich glaube das nicht.
herbivore
Was sollte an meiner Lösung denn Endrekursiv sein?
Gruß pdelvo
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
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