(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: BlockStmt.m3 *) (* Last modified on Fri Feb 23 07:15:45 1990 by muller *) (* modified on Mon Feb 12 08:52:23 1990 by kalsow *) MODULE BlockStmt; IMPORT Scope, Token, Value, Stmt, StmtRep, Variable, Module, Delay, Emit, Decl; FROM Scanner IMPORT Match, cur; TYPE P = Stmt.T OBJECT scope : Scope.T; body : Stmt.T; METHODS bind := Bind; check := Check; precompile := Precompile; compile := Compile; END; PROCEDURE Parse (READONLY fail: Token.Set): Stmt.T = VAR p: P; BEGIN p := NEW (P); StmtRep.Init (p); p.scope := Scope.PushNew (TRUE, NIL); p.body := ParseBlock (fail); Scope.PopNew (); RETURN p; END Parse; PROCEDURE ParseBlock (READONLY fail: Token.Set): Stmt.T = TYPE TK = Token.T; VAR s: Stmt.T; BEGIN WHILE (cur.token IN Token.DeclStart) DO Decl.Parse (fail + Token.Set {TK.tBEGIN, TK.tEND} + Token.DeclStart, FALSE, FALSE); END; Match (TK.tBEGIN, fail, Token.Set {TK.tEND}); s := Stmt.Parse (fail + Token.Set {TK.tEND}); Match (TK.tEND, fail, Token.Set {}); RETURN s; END ParseBlock; PROCEDURE Bind (p: P) = BEGIN Scope.Push (p.scope); Scope.Bind (p.scope, TRUE); Stmt.Bind (p.body); IF Delay.pending THEN Delay.FinishUp () END; Scope.Pop (); END Bind; PROCEDURE Check (p: P) = BEGIN Scope.Push (p.scope); Scope.TypeCheck (p.scope, TRUE); Stmt.TypeCheck (p.body); IF Delay.pending THEN Delay.FinishUp () END; Scope.WarnUnused (p.scope); Scope.Pop (); END Check; PROCEDURE Precompile (p: P) = BEGIN Scope.Push (p.scope); Stmt.Precompile (p.body); Scope.Pop (); END Precompile; PROCEDURE Compile (p: P): Stmt.Outcomes = VAR oc: Stmt.Outcomes; BEGIN Scope.Push (p.scope); Emit.Op ("{\001\n"); Scope.Enter (p.scope); oc := Stmt.Compile (p.body); Scope.Exit (p.scope); Emit.Op ("\002};\n"); Scope.Pop (); RETURN oc; END Compile; BEGIN END BlockStmt.