(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: Main.m3 *) (* Last modified on Wed Feb 14 10:09:54 1990 by kalsow *) (* modified on Sun Jan 21 06:56:46 1990 by muller *) MODULE Main; IMPORT Wr, Text, Fmt; IMPORT Target, String, Token, Error, Scanner, Value, Scope; IMPORT Module, Expr, Type, Stmt, BuiltinTypes, Emit, Host; IMPORT BuiltinOps, WordModule, Delay; PROCEDURE Initialize () = BEGIN (* this list is ordered! *) Host.Initialize (); String.Initialize (); Token.Initialize (); Scanner.Initialize (); Emit.Initialize (); Delay.Initialize (); Scope.Initialize (); Type.Initialize (); Value.Initialize (); Expr.Initialize (); Stmt.Initialize (); BuiltinTypes.Initialize (); BuiltinOps.Initialize (); WordModule.Initialize (); END Initialize; PROCEDURE Compile () = VAR m: Module.T; BEGIN Scanner.Push (Host.filename, Host.source); Scope.Bind (Scope.Initial, TRUE); Module.Bind (WordModule.M); IF (Host.verbose) THEN Wr.PutText (Host.errors, "parsing...\n") END; m := Module.Parse (); IF Failed () THEN RETURN END; IF (Host.verbose) THEN Wr.PutText (Host.errors, "binding...\n") END; Module.Bind (m); IF Failed () THEN RETURN END; Type.Minimize (); Scope.TypeCheck (Scope.Initial, TRUE); Module.TypeCheck (WordModule.M, FALSE); IF (Host.verbose) THEN Wr.PutText (Host.errors, "type checking...\n") END; Module.TypeCheck (m, TRUE); IF Failed () THEN RETURN END; IF (Host.verbose) THEN Wr.PutText (Host.errors, "emitting code...\n") END; Module.Compile (m); IF Failed () THEN RETURN END; END Compile; PROCEDURE Failed (): BOOLEAN = VAR errs, warns: INTEGER; BEGIN Error.Count (errs, warns); RETURN (errs > 0); END Failed; PROCEDURE Finalize () = VAR errs, warns: INTEGER; BEGIN Scanner.Pop (); Error.Count (errs, warns); IF (errs > 0) THEN Wr.PutText (Host.errors, Fmt.Int (errs)); Wr.PutText (Host.errors, " error"); IF (errs > 1) THEN Wr.PutText (Host.errors, "s") END; END; IF (warns > 0) THEN IF (errs > 0) THEN Wr.PutText (Host.errors, " and ") END; Wr.PutText (Host.errors, Fmt.Int (warns)); Wr.PutText (Host.errors, " warning"); IF (warns > 1) THEN Wr.PutText (Host.errors, "s") END; END; IF (errs + warns > 0) THEN Wr.PutText (Host.errors, " encountered\n") END; IF (errs > 0) THEN Host.Halt (errs) END; END Finalize; BEGIN TRY Initialize (); Compile (); Finalize (); FINALLY Host.Halt (0); END; END Main.