(* Copyright (C) 1992, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: InExpr.m3 *) (* Last modified on Mon Mar 2 10:52:25 PST 1992 by kalsow *) (* modified on Thu Nov 29 03:31:28 1990 by muller *) MODULE InExpr; IMPORT Expr, ExprRep, Error, Type, SetType, Bool, SetExpr, Temp, MBuf; TYPE P = ExprRep.Tab BRANDED "InExpr.P" OBJECT OVERRIDES typeOf := ExprRep.NoType; check := Check; compile := Compile; evaluate := Fold; fprint := FPrinter; write := ExprRep.NoWriter; isEqual := ExprRep.EqCheckAB; getBounds := ExprRep.NoBounds; isWritable := ExprRep.IsNever; isDesignator := ExprRep.IsNever; isZeroes := ExprRep.IsNever; note_write := ExprRep.NotWritable; genLiteral := ExprRep.NoLiteral; END; PROCEDURE New (a, b: Expr.T): Expr.T = VAR p: P; BEGIN p := NEW (P); ExprRep.Init (p); p.a := a; p.b := b; p.type := Bool.T; RETURN p; END New; PROCEDURE Check (p: P; VAR cs: Expr.CheckState) = VAR ta, tb, tc: Type.T; BEGIN Expr.TypeCheck (p.a, cs); Expr.TypeCheck (p.b, cs); ta := Type.Base (Expr.TypeOf (p.a)); tb := Type.Base (Expr.TypeOf (p.b)); IF NOT SetType.Split (tb, tc) THEN Error.Msg ("second operand of IN must be a set"); ELSIF NOT Type.IsSubtype (ta, Type.Base (tc)) THEN Error.Msg ("operands of IN are incompatible"); END; END Check; PROCEDURE Compile (p: P): Temp.T = VAR t3: Temp.T; BEGIN t3 := Temp.Alloc (p); SetExpr.CompileMember (p.b, p.a, t3, p.b.type); RETURN t3; END Compile; PROCEDURE Fold (p: P): Expr.T = VAR e1, e2, e3: Expr.T; BEGIN e1 := Expr.ConstValue (p.b); e2 := Expr.ConstValue (p.a); e3 := NIL; IF (e1 = NIL) OR (e2 = NIL) THEN ELSIF SetExpr.Member (e1, e2, e3) THEN END; RETURN e3; END Fold; PROCEDURE FPrinter (p: P; map: Type.FPMap; wr: MBuf.T) = BEGIN MBuf.PutText (wr, "IN "); Expr.Fingerprint (p.a, map, wr); Expr.Fingerprint (p.b, map, wr); END FPrinter; BEGIN END InExpr.