Allgemeines Vorgehen bei der Interpretation von String-Inputs?
-
Morgen,
ich arbeite gerade an einer Vektor-Klasse und möchte die in einer Art Konsolen-Eingabe verpacken.
Z.B. soll der User eintippen können
v1 add v1 v2
was soviel heißt wie, v1 = v1 + v2. Die Vektoren sollen dabei in einer kleinen Liste von vielleicht 8 Vektoren gespeichert sein und immer angezeigt werden.
Da es aber neben der Addition von Vektoren noch diverse andere Befehle geben soll (Subtraktion, Skalarprodukt, Kreuzprodukt, Einheitsvektor, Länge des Vektors,...) suche ich jetzt nach einer effizienten Method, den Input des Users zu durchsuchen und die richtige Funktion zu starten.
Dabei muss beachtet werden, ob die Vektoren überhaupt schon erzeugt wurde, ob sie der selben Dimension angehören, ob das ergebnis in einem Vektor gespeichert werden soll (v1 add ...) oder direkt ausgegeben werden soll (print add ...)Wie geht man hier am besten vor? Die genaue technische Umsetzung ist mir erstmal schnurz, wie man mit Strings umgeht, weiß ich im großen und ganzen. Es geht mir wirklich nur um das vorgehen.
Vielen Dank im Voraus,
GrüßePS: Wer die Frage nicht verstanden hat, was bei meinen Fragen irgendwie oft der Fall ist, einfach nochmal nachhaken.

-
Du hast dir da so eine Art umgekehrt polnische Notation (UPN) ausgedacht, bloß nicht "umgekehrt". Das ist schon einmal gut, denn die ist relativ einfach zu parsen. Noch besser wäre es natürlich, wenn du dich auf richtige UPN festlegst, der Beispielausdruck würde dann "v1 v2 add" lauten (das Speichern würde ich erst einmal weglassen oder als eigenen Befehl implementieren).
Auf Wikipedia findest du auch erklärt wie man das parsen kann. Man geht den Ausdruck von links nach rechts durch. Bekommt man einen vector, so schiebt man ihn in ein freies Register. Kommt eine Operation, wird sie auf den Registern ausgeführt. Das Ergebnis ist der aktuelle Wert und landet im ersten Register. Auf Wikipedia ist das viel besser erklärt als ich das hier kann, daher fasse ich mich kurz.
-
UPN ist gar nicht nötig, nichtmal sachdienlich, fürchte ich.
Alle Befehle haben das Format
ergebnisvariable befehl [parameter1 [parameter2]]
Das läßt sich doch prima parsen.
Da es manche Befehle gibt, die keine sinnvolle Ergebnisvariable haben, würde ich den Befehl vorziehen.
befehl [ergebnisvariable] [parameter1 [parameter2]]
Und dann kannste immer das erste Wort lesen und zu der jeweiligen Parse-und Verarbeitungs-Funktion springen, die dem Wort entspricht. unordered_map<string,funktionszeiger> vielleicht.
-
ruhig_brauner schrieb:
Wie geht man hier am besten vor? Die genaue technische Umsetzung ist mir erstmal schnurz, wie man mit Strings umgeht, weiß ich im großen und ganzen. Es geht mir wirklich nur um das vorgehen.
Wo sind denn da Strings?
Du beschreibst uns, dass Du einen Input von der Konsole hast, und den möchtest Du parsen. Da tauchen erst mal keine Strings auf. Die Schnittstelle ist im Normalfall ein std::istream. Und mit Hilfe des istream's und Kenntniss seiner Fähigkeiten(!) kann man den von Dir beschriebenen Ausdruck parsen.
Ein Beispiel für eine ähnliche Anwendungen findest Du hier und hinter den Links auf die dort verwiesen wird.Gruß
Werner
-
Naja, ich lese die ganze Zeile ein und interpretiere den String dann. Aber mit ein wenig Suchen schaffe ich das bestimmt auch mit istream

Also alle Befehle sollen eine bestimmte Struktur haben. sinnvoll wäre z.B.
print = add v1 v2
v1 = cp v1 v2und so weiter. Wenn ich das ding interpretiere muss man ja erstmal gucken, ob da überhaupt sinnvolles drinn steht. Als erstes kann man ja mal ads '=' raus hauen, dass ist ja nur für die Verständlichkeit da. Dann steht da
v1 cp v2 v3 oder sonnstiges.
Das zweite Wort ist also der Befehl, das erste das Ziel der Rechnung und hinter dem zweiten Wort kommen die Parameter (zwischen 1 und 3)
Sollte ich eine Unterfunktion für jede Operation schreiben? Meine Idee wäre dann, zu gucken ob v1, v2 u.s.w. gültige Vektoren sind und z.B. ob ic nicht versuche eine Zahl in einen Vektor zu schreiben.
Ich glaube mit dem Stichwort parsen komm ich erstmal wesentlich weiter.
Danke