Registriert seit: 31. Okt 2003
Ort: Hamburg
42 Beiträge
|
Re: wie bearbeitet ein Compiler if-Abfragen?
1. Feb 2005, 08:32
Hallo dragi,
das ganze ist nicht schwierig, aber man muss etwas aufpassen und nachdenken. Da du etwas Quelltextmässiges haben wolltest, kann ich ja mal (grob) skizzieren, wie ein klassischer rekursiv-absteigender Compiler da rangeht. Ich nenne die Dinge mal mit den namen und N. Wirth, weil die meisten das wiedererkennen werden. Die ganzen sprachspezifischen Sonderdinge lass ich mal weg.
Das IF-Statement lautet z.B.: IF <Ausdruck> THEN <Anweisungen> ENDIF
Der Compiler sieht das IF und sagt sich: Aha, ein IF-Statement. Da folgt jetzt ein <Ausdruck>. Danach muss THEN folgen, danach <Anweisungen>, danach ein ENDIF.
Der Trick beim rekursiv-absteigenden Parser ist jetzt, dass das <Ausdruck> eben wieder eine Prozedur ist (genau wie <Anweisungen>).
Um deine Frage nach dem Operatoren-Vorrang zu beantworten, das geht so:
Ein <Ausdruck> ist <einfacher_Ausdruck> {<= <> < > <= >= <einfacher_Ausdruck>}
Ein <einfacher_Ausdruck> ist <Term> { + - <Term>}
Ein <Term> ist <Faktor> {* / <Faktor>}
Ein <Faktor> ist eine Variable, ein Literal, oder aber auch wieder ein <Ausdruck> in Klammern.
Die {} bedeuten hier null oder mehrere Wiederholungen. Jede Struktur (einfacher_Ausdruck, Term, Faktor) bekommt eine eigene Prozedur zum Parsen, die dann wieder die darunterliegenden teile aufruft.
In dieser Struktur wird im Speicher ein Baum aufgebaut, der den Ausdruck abbildet und danach in Code umgesetzt werden kann. Dadurch, dass ein <Faktor> wieder ein geklammerter Ausdruck sein kann, hat man eine rekursive Struktur.
Probier's mal mit X + Y * Z; dabei wird durch die Aufteilung in Term und Faktor automatisch der Ausdruck beim "+" aufgeteilt, und das "*" wird dem Y und dem Z zugeordnet, wo es ja auch hingehört.
Wenn du noch mehr Erläuterung brauchst, kannst Du dich ja nochmal melden. Ist am Anfang etwas verwirrend, aber wenn man es einmal kapiert hat, geht's recht leicht.
Viel Spass
Peter
Peter Rehders Man sollte niemanden ernst nehmen, der sich ernst nimmt.
|