home *** CD-ROM | disk | FTP | other *** search
- MODULE Compiler;
- (****************************************************************************
- Dieses Programm ist ein "recursive descent"-Compiler für Wertzuweisungen
- "Punkt vor Strich"-Regel wird berücksichtigt
- Eingabebsp.: a:= b-c*d
- Ausgabe: Erklärung:
- -------- ----------
- LOAD b ,b wird vom Speicher in den Stack geholt
- LOAD c ,c wird vom Speicher in den Stack geholt
- LOAD d ,d wird vom Speicher in den Stack geholt
- MULT ,die oberen beiden Elemente werden vom Stack
- in die Arithmethik-Einheit geholt, dort
- miteinander multipliziert und das Ergebnis
- im Stack oben abgespeichert
- SUB ,die oberen beiden Elemente werden vom Stack
- in die Arithmethik-Einheit geholt, dort
- voneinander subtrahiert und das Ergebnis
- im Stack oben abgespeichert
- STORE a ,das sich im Stack befindliche Ergebnis wird
- in der Speichereinheit unter a abgelegt
- ****************************************************************************)
-
- FROM InOut IMPORT WriteCard,WriteLn,ReadString,WriteString;
- FROM IO IMPORT WrStr,WrLn;
-
- VAR i:CARDINAL;
- next:CHAR;
- s:ARRAY[1..80] OF CHAR;
-
- PROCEDURE Faktor;FORWARD;
- PROCEDURE Ausdruck;FORWARD;
-
- PROCEDURE Lese;
- BEGIN
- INC(i);
- next:=s[i]
- END Lese;
-
- PROCEDURE Ausgabe(n:CARDINAL; c:CHAR);
- BEGIN
- CASE n OF
- 1: WriteString('ADD'); |
- 2: WriteString('SUB');|
- 3: WriteString('MULT');|
- 4: WriteString('DIV');|
- 5: WriteString('LOAD'); WriteString(c); |
- 6: WriteString('STORE'); WriteString(c)
- END; (*CASE*)
- WriteLn;
- END Ausgabe;
-
- PROCEDURE Fehler;
- BEGIN
- WriteLn;
- WriteString('Fehler in Position ');
- WriteCard(i,2);
- HALT
- END Fehler;
-
- PROCEDURE Faktor;
- BEGIN
- CASE next OF
- "a".."z": Ausgabe(5,next); Lese; RETURN |
- "(": Lese; Ausdruck;
- IF next=")" THEN Lese; RETURN
- ELSE Fehler
- END (*IF*)
- ELSE Fehler
- END (*CASE*)
- END Faktor;
-
- PROCEDURE Term;
- BEGIN
- Faktor;
- LOOP
- CASE next OF
- "*": Lese; Faktor; Ausgabe(3," "); |
- "/": Lese; Faktor; Ausgabe(4," "); |
- "-","+",")",0C: RETURN
- ELSE Fehler
- END (*CASE*)
- END (*LOOP*)
- END Term;
-
- PROCEDURE Ausdruck;
- BEGIN
- Term;
- LOOP
- CASE next OF
- "+": Lese; Term; Ausgabe(1," ");|
- "-": Lese; Term; Ausgabe(2," ");|
- ")",0C: RETURN
- ELSE Fehler
- END (*CASE*)
- END (*LOOP*)
- END Ausdruck;
-
-
-
-
-
- PROCEDURE Wertzuweisung;
- VAR ch:CHAR;
- BEGIN
- CASE next OF
- "a".."z": ch:=next;
- Lese;
- IF next <> ":" THEN Fehler END;
- Lese;
- IF next <> "=" THEN Fehler END;
- Lese;
- Ausdruck;
- Ausgabe(6,ch);
- ELSE Fehler
- END
- END Wertzuweisung;
-
-
-
-
-
- BEGIN (*MAIN*)
- WrStr('Dieses Programm ist ein "recursive descent"-Compiler für');WrLn;
- WrStr('Wertzuweisungen.');WrLn;
- WrStr('"Punkt vor Strich"-Regel wird berücksichtigt.');WrLn;
- WrStr('Eingabe: ');
- ReadString(s);
- i:=0;
- Lese;
- WriteLn;
- Wertzuweisung
- END Compiler.