home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
fst
/
mod2brd1
/
compiler.mod
< prev
next >
Wrap
Text File
|
1990-04-06
|
4KB
|
132 lines
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.