m3tk/src/sem/M3COrdinal.i3


INTERFACE M3COrdinal;
************************************************************************* Copyright (C) Olivetti 1989 All Rights reserved Use and copy of this software and preparation of derivative works based upon this software are permitted to any person, provided this same copyright notice and the following Olivetti warranty disclaimer are included in any copy of the software or any modification thereof or derivative work therefrom made by any person. This software is made available AS IS and Olivetti disclaims all warranties with respect to this software, whether expressed or implied under any law, including all implied warranties of merchantibility and fitness for any purpose. In no event shall Olivetti be liable for any damages whatsoever resulting from loss of use, data or profits or otherwise arising out of or in connection with the use or performance of this software. *************************************************************************

IMPORT M3AST_AS, M3AST_SM;

PROCEDURE Is(
    t: M3AST_SM.TYPE_SPEC_UNSET;
    VAR (*out*) baseType: M3AST_SM.TYPE_SPEC_UNSET)
    : BOOLEAN
    RAISES {};
TRUE if 't' is an ordinal type. If 't' is a subrange or packed ordinal type sets 'baseType' to the base type of 't' otherwise sets it to 't'. Note that 'baseType' can only be set to one of INTEGER, an enumeration or unset; e.g. the base type of BITS 8 FOR [0..255] is INTEGER. If 't' is Unset optimistically returns TRUE, 'baseType' Unset. Relies on the sm_base_type_spec attribute of subranges

PROCEDURE SameSupertype(
    type1, type2: M3AST_SM.TYPE_SPEC_UNSET)
    : BOOLEAN
    RAISES {};
succeeds if both types are ordinal and have identical base types. Is a little optimistic - succeeds if one type is unset and the other is ordinal. Relies on the sm_base_type_spec attribute of subranges

PROCEDURE ValidBounds(
    subrange: M3AST_AS.Subrange_type;
    VAR first, last: M3AST_SM.Exp_value)
    : BOOLEAN
    RAISES {};
return the bounds of a subrange providing that they are compatible with each other (i.e. are ordinal and share the same supertype). If not 'first' and 'last' are left unchanged and FALSE is returned. Fails if the base type or the type of either bound expression is unset. Relies on the sm_base_type_spec attribute of subranges Relies on the sm_exp_value attribute of subrange bound expressions Relies on the sm_exp_type_spec attribute of subrange bound expressions

PROCEDURE Identical(t1, t2: M3AST_SM.TYPE_SPEC_UNSET): BOOLEAN RAISES {};
succeeds if given types are identical ordinal types. 't1' must be an ordinal or set type (it cannot even be unset) - if it is not a fatal error will be raised (note 't1' can be packed, provided it is a packed ordinal). 't2' can be any type. Special case: if 't2' is unset 'Identical' will optimistically succeed even if 't1' is not an ordinal or set type. 'Identical' deals with sets in addition to ordinals because it is used by the 'SubType' procedure, below. Why 'SubType' deals with sets is also explained below. Relies on the sm_base_type_spec attribute of subranges. Calls 'M3CBackEnd.Compare' on subrange bounds

PROCEDURE SubType(t1, t2: M3AST_SM.TYPE_SPEC_UNSET): BOOLEAN RAISES {};
succeeds if t1 <: t2 and t1 is an ordinal or set type. 't1' must be an ordinal or set (it cannot even be unset) - if it is not a fatal error will be raised (note 't1' can be packed, provided it is a packed ordinal). 't2' can be any type. Special case: if 't2' is unset 'SubType' will always optimistically succeed, even if 't1' is not an ordinal or set type. 'SubType' deals with sets in addition to ordinals because set subtyping is needed when the compiler is typing expressions (the 'M3CTypeRelation' subtype routine assumes that expression typing has been done). Relies on the sm_base_type_spec attribute of subranges. Relies on the sm_type_spec attribute of named types Calls 'M3CBackEnd.Compare' on subrange bounds

PROCEDURE Overlap(t1, t2: M3AST_SM.TYPE_SPEC_UNSET): BOOLEAN RAISES {};
succeeds if both types are ordinal and they overlap (i.e. have at least one member in common). Is optimistic and succeeds if one type is ordinal and the other is unset. Relies on the sm_base_type_spec attribute of subranges. Calls 'M3CBackEnd.Compare' on subrange bounds

PROCEDURE IsMemberOf(
    sub: M3AST_AS.Subrange_type;
    exp: M3AST_AS.EXP)
    : BOOLEAN
    RAISES {};
checks if the given expression is a member of the given subrange. Is optimistic - succeeds if the expression is not constant or if the subrange base type is unset. Relies on the sm_base_type_spec attribute of subranges. Calls 'M3CBackEnd.Compare' on subrange bounds and 'exp'

END M3COrdinal.