Copyright (C) 1994, Digital Equipment Corp. INTERFACEA few random conveniences...M3CharPreds ; IMPORT M3AST_AS, M3Error; PROCEDURE Es (e: M3AST_AS.EXP): BOOLEAN; (* constant expression that introduces dependency CHAR: *SIZE(TC(Ts)) FIRST|LAST|NUMBER([a] Tn) *) PROCEDURE Ecs (e: M3AST_AS.EXP): BOOLEAN; (* constant expression that depends on CHAR: Es VAL(Ecs, ...) binary or unary value combination (Ecs, ...) Word operation on Ecs, ... value cons ...{...Ecs, ...} Ecs.f Ecs[...] ...[Ecs] *) PROCEDURE Tn (ts: M3AST_AS.TYPE_SPEC): BOOLEAN; (* type whose FIRST, LAST, or NUMBER depends on CHAR: CHAR ARRAY Tn OF ... [...Ecs...] *) PROCEDURE Th (ts: M3AST_AS.TYPE_SPEC): BOOLEAN; (* type that will become impractically large ("Huge"): ARRAY Tn OF ... SET OF Tn *) PROCEDURE Tr (ts: M3AST_AS.TYPE_SPEC): BOOLEAN; (* type that will be replaced: Th BITS Ecs FOR ... BITS ... FOR TC(Ts) *) PROCEDURE Ts (ts: M3AST_AS.TYPE_SPEC): BOOLEAN; (* type whose size introduces dependency on CHAR: Tn Tr *) TYPE PredTypeProc = PROCEDURE (ts: M3AST_AS.TYPE_SPEC): BOOLEAN; (* procedure type for passing as argument to "TC" *) PROCEDURE TC (ts: M3AST_AS.TYPE_SPEC; tp: PredTypeProc): BOOLEAN; (* maps kind Tx to kind of types that contain a Tx: Tx RECORD ... f: TC(Tx) ... END ARRAY ... OF TC(Tx) BITS ... FOR TC(Tx) *) PROCEDURE TCO (ts: M3AST_AS.TYPE_SPEC; tp: PredTypeProc): BOOLEAN; (* maps kind Tx to kind of object types that contain a Tx: ... OBJECT ... f: TC(Tx) ... END (* a TC(Tx) anywhere in type hierarchy *) *) PROCEDURE Tm (ts: M3AST_AS.TYPE_SPEC): BOOLEAN; (* type that mentions CHAR in any way *) TYPE Char_Grade = {No (* not in Tm *), Td (* Tm - TC(Ts) *), TcTs (* TC(Ts) *)}; PROCEDURE Grade (ts: M3AST_AS.TYPE_SPEC): Char_Grade; (* Determine whether this type is in TC(Ts), Td, or neither *) PROCEDURE ArrayTnOf (ts: M3AST_AS.TYPE_SPEC): BOOLEAN; (* TRUE iff "ts" denotes an "ARRAY Tn OF ..." *)
PROCEDURE M3TYPE_To_TYPE_SPEC (m: M3AST_AS.M3TYPE): M3AST_AS.TYPE_SPEC; (* M3CTypesMisc.GetTYPE_SPECFromM3TYPE recast as a function *) PROCEDURE ReportInUnit(unit : M3AST_AS.UNIT_ID; n : M3Error.ERROR_NODE; message: TEXT) RAISES {}; (* Like M3Error.Report, but for a (potentially) different compilation unit. *) END M3CharPreds.