(****************************** * Programm von Dieter Seidel * * Eingegeben am 14.11.1991 * ******************************) IMPLEMENTATION MODULE QuadBerechneQuad; FROM InOut IMPORT WriteCard, WriteLn, Write, WriteString; FROM QuadLese IMPORT MaxBefehle, MaxQuad, MaxZeile, WhileBegin, arrZeile, QuadZeile, arrQuad, arrList; FROM QuadHoleBefehle IMPORT HoleZuweisung, HoleSchleife, HoleUnterprogramm; PROCEDURE BerechneQuad( BefehlsListe : arrList; VAR QuadListe : arrQuad); VAR Zaehler, Zeiger, Counter, Counter2, begin : CARDINAL; Korrekt : BOOLEAN; array : ARRAY [1..MaxBefehle] OF WhileBegin; BEGIN begin:=0; Zaehler:=1; Zeiger:=1; REPEAT Korrekt:=FALSE; IF (Zaehler > MaxQuad) THEN WriteLn; WriteString("Fehler : Erhoehe MaxQuad!!!"); WriteLn; HALT; END; IF ((Zeiger+10) > MaxBefehle) THEN WriteLn; WriteString("Fehler : Erhoehe MaxBefehle!!!"); WriteLn; HALT; END; IF (BefehlsListe[Zeiger] = "b") AND NOT(Korrekt) THEN IF Zaehler > 1 THEN IF array[Zaehler-1].while THEN array[Zaehler-1].begin:=TRUE; ELSE WriteLn; WriteString("Fehler : kein while-begin gefunden!!!"); WriteLn; HALT; END; END; INC(begin); INC(Zeiger); Korrekt:=TRUE; END; IF (BefehlsListe[Zeiger] = "X") AND NOT(Korrekt) THEN HoleZuweisung(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger); QuadListe[Zaehler].Zeile:=Zaehler; QuadListe[Zaehler].IFzeile:=Zaehler+1; QuadListe[Zaehler].ELSEzeile:=Zaehler+1; IF Zaehler > 1 THEN IF array[Zaehler-1].while AND NOT(array[Zaehler-1].begin) THEN QuadListe[Zaehler].IFzeile:=Zaehler-1; QuadListe[Zaehler].ELSEzeile:=Zaehler-1; Counter:=Zaehler-1; WHILE (Counter >= 1) AND (array[Counter].while) AND NOT(array[Counter].begin) DO DEC(Counter); END; INC(Counter); QuadListe[Counter].IFzeile:=Counter+1; QuadListe[Counter].ELSEzeile:=Zaehler+1; INC(Counter); WHILE Counter < Zaehler DO QuadListe[Counter].IFzeile:=Counter+1; QuadListe[Counter].ELSEzeile:=Counter-1; INC(Counter); END; END; END; array[Zaehler].while:=FALSE; array[Zaehler].begin:=FALSE; INC(Zaehler); Korrekt:=TRUE; END; IF (BefehlsListe[Zeiger] = "U") AND NOT(Korrekt) THEN HoleUnterprogramm(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger); QuadListe[Zaehler].Zeile:=Zaehler; QuadListe[Zaehler].IFzeile:=Zaehler+1; QuadListe[Zaehler].ELSEzeile:=Zaehler+1; IF Zaehler > 1 THEN IF array[Zaehler-1].while AND NOT(array[Zaehler-1].begin) THEN QuadListe[Zaehler].IFzeile:=Zaehler-1; QuadListe[Zaehler].ELSEzeile:=Zaehler-1; Counter:=Zaehler-1; WHILE (Counter >= 1) AND (array[Counter].while) AND NOT(array[Counter].begin) DO DEC(Counter); END; INC(Counter); QuadListe[Counter].IFzeile:=Counter+1; QuadListe[Counter].ELSEzeile:=Zaehler+1; INC(Counter); WHILE Counter < Zaehler DO QuadListe[Counter].IFzeile:=Counter+1; QuadListe[Counter].ELSEzeile:=Counter-1; INC(Counter); END; END; END; array[Zaehler].while:=FALSE; array[Zaehler].begin:=FALSE; INC(Zaehler); Korrekt:=TRUE; END; IF (BefehlsListe[Zeiger] = "w") AND NOT(Korrekt) THEN INC(Zeiger); HoleSchleife(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger); QuadListe[Zaehler].Zeile:=Zaehler; QuadListe[Zaehler].IFzeile:=0; (* Zaehler+1; *) QuadListe[Zaehler].ELSEzeile:=0; (* Zaehler+2; *) array[Zaehler].whileZeiger:=Zaehler; array[Zaehler].while:=TRUE; array[Zaehler].begin:=FALSE; INC(Zaehler); Korrekt:=TRUE; END; IF (BefehlsListe[Zeiger] = "e") AND NOT(Korrekt) THEN IF begin > 1 THEN Counter:=Zaehler-1; WHILE NOT(array[Counter].begin) AND (Counter >= 1) DO DEC(Counter); END; IF array[Counter].begin THEN array[Counter].begin:=FALSE; Counter2:=Counter+1; WHILE (Counter2 < Zaehler) AND (QuadListe[Counter2].ELSEzeile # Zaehler) DO INC(Counter2); END; IF (QuadListe[Counter2].ELSEzeile = Zaehler) AND (array[Counter2].while) AND (Counter2 < Zaehler) THEN QuadListe[Counter2].ELSEzeile:=array[Counter].whileZeiger; ELSE QuadListe[Zaehler-1].IFzeile:=array[Counter].whileZeiger; QuadListe[Zaehler-1].ELSEzeile:=array[Counter].whileZeiger; END; Counter2:=Counter-1; WHILE (Counter2 >= 1) AND (array[Counter2].while) AND NOT(array[Counter2].begin) DO DEC(Counter2); END; INC(Counter2); IF Counter2 >= 1 THEN IF array[Counter2-1].while THEN QuadListe[Counter2].ELSEzeile:=Counter2-1; END; END; IF (array[Counter2].while) AND NOT(array[Counter2].begin) THEN QuadListe[Counter2].ELSEzeile:=Zaehler; QuadListe[Counter2].IFzeile:=Counter2+1; INC(Counter2); WHILE Counter2 <= Counter DO QuadListe[Counter2].ELSEzeile:=Counter2-1; QuadListe[Counter2].IFzeile:=Counter2+1; INC(Counter2); END; END; ELSE WriteLn; WriteString("Ein 'end' ohne 'begin' gefunden!!!"); WriteLn; HALT; END; END; DEC(begin); INC(Zeiger); IF BefehlsListe[Zeiger] = ";" THEN INC(Zeiger); END; Korrekt:=TRUE; END; IF NOT(Korrekt) THEN WriteLn; WriteString("Fehler!!! Keine korrekte Anweisung."); WriteLn; HALT; END; UNTIL begin = 0; IF Zaehler > MaxQuad THEN WriteLn; WriteString("Erhoehe MaxQuad!!!"); WriteLn; HALT; ELSE QuadListe[Zaehler].Zeile:=0; QuadListe[Zaehler].IFzeile:=0; QuadListe[Zaehler].ELSEzeile:=0; QuadListe[Zaehler].Befehl:=""; END; END BerechneQuad; END QuadBerechneQuad.