gizno82 hat geschrieben:Sehe ich das richtig, dass man einen Syntaxbaum nach der Wertigkeit der Operatoren der festgelegten Grammatik aufbaut ?
Richtig.
gizno82 hat geschrieben:sprich: 2*5+3 = Punkt vor Strich Prinzip, * wäre die Würzel des Baumes, 2 geht links davon weg, 5 rechts davon. + geht
von der 5 weg und die 3 geht vom + als Blatt weg.
Ist der Baum richtig aufgebaut ?
Nein. Punktrechnung vor Strichrechnung bedeutet gewissermaßen, dass man die Punktrechnung vor der Strichrechnung klammert: (2*5)+3. Du trennst also die Punktrechnung erstmal nicht auf.
Die Klammern beschreiben zusammengehörige Blätter. Komplett wäre das [ [(2)*(5)] + (3) ], wobei die äußerste Klammer die Wurzel repräsentiert. Klammern für Operatoren habe ich hier mal eckig gemacht. Die Aufgabe ist mathematisch gleichwertig, die Klammern beschreiben aber jetzt die Rechenvorschriften, die man in der Grundschule automatisch lernt. Die Werte der Zahlen sind am einfachsten zu ermitteln: durch Ablesen.
Dein Baum sieht also so aus:
Um den Baum auszurechnen, fragt Du den Wert der Wurzel ab. Um + auszurechen, fragst Du den Wert links und rechts ab und addiert diese. Der Wert links ergibt sich aus der Multiplikation aus dem Produkt der Kinder. Diese sind einfach zu Berechnen. Um das linke Kind von + zu berechnen wird also erst multipliziert: Punktrechnung vor Strichrechnung.
Du siehst: im eigentlichen Compilerbaum musst Du Dich nicht mehr um Prioritäten von Operatoren kümmern. Dein Vorschlag
ermöglicht es nicht einfach zu fragen, welchen Wert ein Kind hat. (2) hat den Wert 2. Aber was hat 5 \ + \ 3 für einen Wert und wie rechne ich das in die Multiplikation ein?
Also kommen wir nochmal zur ursprünglichen Frage zurück:
gizno82 hat geschrieben:Sehe ich das richtig, dass man einen Syntaxbaum nach der Wertigkeit der Operatoren der festgelegten Grammatik aufbaut ?
Der Operator mit der stärksten Bindung (Punkt vor Strich) findet sich tief im Baum, damit er bevorzugt abgearbeitet wird. Der Operator mit der niedrigen Bindung, findet sich näher an der Wurzel.
gizno82 hat geschrieben:Wozu braucht man beim Compilerbau eine Statemachine und welche Statemachine nutzt man ?
Was verstehst Du unter einer Statemaschine?
Du kannst den Compiler als Statemaschine verstehen, welcher sich in unterschiedlichen Kontexten unterschiedlich verhalten kann. Im Status "Klassendefinition" wäre das Statement "break" in C ungewünscht - im Status "Befehlspaket einer while-Schleife" hingegen ist "break" akzeptabel.
Oder Du kannst die CPU als Statemaschine verstehen. Die CPU kann (muss nicht) ein Ziel für eine Übersetzung sein.