Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Im Übrigen, der Grund dafür, dass dein Test nicht funktioniert ist folgender: Du maskierst das erste Bit, setzt aber mittels int i = 2 das zweite Bit. Ändere entweder deine Maske auf (i&0x00000002) oder i auf 1
Ja Problem gelöst. Vertraue niemals dem Internet.
Ich hatte static_cast genommen da ich es einfach haben wollte. Das kann nur keine 4 Byte in einen integer casten Jetzt gehts:
Hmm ich hab noch nicht so ganz verstanden wie der recursive decent parser jetzt Ausdrücke parsen soll die später kommen.
Beispiel:
Quellcode
1
_x = 1-2+3
Ergibt bei mir momentan -4, da der Vorgang momentan so aussieht:
1. _x wird als Variable erkannt und angelegt.
2. = wird als Zuweisung erkannt, das _x wird rechts an den Tree angehangen.
3. 1 wird als Wert erkannt.
4. - wird als Subtraktion erkannt, links wird die 1 angehangen, der halbe Term links an die Zuweisung.
5. 2 wird an die Subtraktion rechts angehangen.
6. + wird erkannt und hinter die Subtraktion gehangen.
7. 3 wird an die Addition gehangen.
So durchläuft der Parser ohne vorher zu wissen was kommt. Um das zu erreichen gibt es pro Ausdruck eine Methode, hier werden (in der Reihenfolge) genutzt: parseVariable(), parseAssign(), parseValue(), parseAdd(), parseValue(), ...
Dass ich so den Ausdruck nicht korrekt einlesen kann ist mir klar, jedoch finde ich auch nur Beispiele die keinen Syntax Tree erstellen, sondern direkt eine Ausgabe erzeugen.
Hier der generierte Syntax Tree in Pseudo-Assembler:
Quellcode
1
2
3
4
5
6
7
val 1
val 2
val 3
add = 5
sub = -4
setID 0
assign
Ihr müsst euch dass als umgedrehten Tree vorstellen. Der würde dann so aussehen:
+ und - sind auf Grund des Einlesens vertauscht.
Ich hab gerade keine so gute Vorstellung davon wie ich das jetzt rekursiv beheben kann...
Vor allem wann was wo angehangen werden soll ist schwierig zu handhaben.
Dieses Beispiel habe ich mir mal angesehen, ich verstehe nicht warum das
C-/C++-Quelltext
1
2
3
4
5
6
7
8
9
10
int expression()
{
int result = term();
while (peek() =='+'|| peek() =='-') // <-if (get() =='+')
result += term();
else
result -= term();
return result;
}
funktioniert, da ich zwischendurch ja noch Werte und Variablen habe, die erkannt werden sollen.
Ob du direkt ausgibst oder den Baum explizit erzeugst ist von der Logik eigentlich egal. Was du eigentlich machen möchtest ist doch die Subtraktion als linken Parameter für die Addition benutzen. Was sinnvoll sein kann ist wenn du dir beide Möglichkeiten des Parsings als Syntaxbaum aufmalst. Eine Version vom Syntaxbaum hast du ja bereits in deinem Post gezeigt. Bin mir grad nicht sicher, aber du besitzt doch auch den C++ Programmierer oder nicht? Da ist ein Kapitel zum Thema Parser. Da wird auch direkt ausgegeben, aber auf dein Problem müsste da auch eingegangen werden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“
Wie meinst du das "als linken Parameter"?
Es müsste ja eigentlich so sein dass das + und - getauscht werden, da der Baum von unten nach oben aufgelöst wird, und 1-2+3 nicht das gleiche ist wie 2+3-1 (so wie es im moment ist, theoretisch natürlich schon, aber wenn man "mit Stack denkt" nicht -> push 1 push 2 push 3 add sub Versus push 1 push 2 push 3 sub add).
Was ja schon mal gut ist. Dann würde ich jetzt den linken Bereich (_x) auswerten und dann den rechten (1). Wobei man hier schon die Grammatik beachten könnte, also links muss eine Variable stehen und rechts irgend ein Ausdruck.
Der Syntax Tree muss dann so aussehen dass die Variable rechts, und der Wert links angehangen wird. Damit die VM dann erst die 1 auf den Stack liest bevor sie die _x ID setzt und zuweist.