MODULE PL0; FROM InOut IMPORT Read, ReadString, Write, WriteString, WriteLn, OpenInput, CloseInput, Done; FROM SyntaxAnalysis IMPORT parse, SyntaxError; FROM Synthesis IMPORT traverse, SemanticError; FROM Generator IMPORT CodeStore; FROM Interpreter IMPORT Interpret; FROM InternalTree IMPORT blckPtr; IMPORT STextIO,FIO; FROM Strings IMPORT Length; VAR InputFileName : ARRAY[0..40] OF CHAR; TREE : blckPtr; c : CHAR; DEBUG : BOOLEAN; jamais : CARDINAL; PROCEDURE ReadLn(VAR c: CHAR); VAR lc : CHAR; BEGIN REPEAT Read(c) UNTIL c > ' '; REPEAT Read(lc) UNTIL (lc = 12C) OR (lc = 15C) END ReadLn; PROCEDURE ApendExtension; VAR i : CARDINAL; BEGIN i := 0; LOOP IF InputFileName[i] = 0C THEN InputFileName[i] := '.'; INC(i); InputFileName[i] := 'p'; INC(i); InputFileName[i] := 'l'; INC(i); InputFileName[i] := '0'; INC(i); InputFileName[i] := 0C; EXIT END; IF (InputFileName[i] = '.') OR (i = 40) THEN EXIT END; INC(i) END END ApendExtension; BEGIN DEBUG := TRUE; STextIO.WriteString("PL0 Compiler/Interpreter"); WriteLn; STextIO.WriteString("First implementation by : "); WriteLn; STextIO.WriteString("First Working Version : Eric Streit 18/05/2026"); WriteLn; LOOP InputFileName := ""; Done := FALSE; STextIO.WriteLn; STextIO.WriteString("Entrez le nom de fichier PL0 > "); OpenInput("pl0"); IF DEBUG THEN STextIO.WriteString("***"); IF Done THEN WriteString("TRUE"); END; STextIO.WriteString("***"); STextIO.WriteLn; END; IF Done THEN STextIO.WriteLn; STextIO.WriteString("Syntactic Analyser"); STextIO.WriteLn; TREE := parse(); CloseInput; (* read again from standard input *) IF NOT SyntaxError THEN STextIO.WriteLn; STextIO.WriteString("Semantic Analysis und Code Generation"); STextIO.WriteLn; traverse(TREE); IF NOT SemanticError THEN REPEAT STextIO.WriteLn; STextIO.WriteString("Programm translation and run (y/n) ?"); STextIO.ReadChar(c); IF c = "y" THEN STextIO.WriteLn; Interpret(CodeStore) ELSE HALT END UNTIL c = 'n' END END ELSE Write("'"); WriteString(InputFileName); WriteString("' not found"); WriteLn END; END; (* loop *) END PL0.