HANDBOOK / CASE STUDY / The Compiler /

# Translating Designators

Here is the specification for translating designators:

    282  'action' Designator(Desig: DESIG -> Type: TYPE)
    283     'rule' Designator(id(Ident, Pos) -> T) :
    284        Apply(Ident, Pos -> Obj)
    285        Access(Obj, Pos -> T)
    286     'rule' Designator(subscr(Array, Index, Pos) -> T) :
    287        Designator(Array -> TArray)
    288        Expression(Index -> TIndex)
    289        CheckArrayType(TArray, Pos -> Lwb, Upb, T)
    290        TypeSize(T -> Size)
    291        CheckInt(TIndex, Pos)
    292        CHK(Lwb, Upb)
    293        LDC(1, Lwb)
    294        SUB
    295        IXA(Size)

    296  'action' Access(Obj: OBJ, Pos: POS -> Type: TYPE)
    297     'rule' Access(object(varobj(Offset, Type), Level, Hidden), Pos
    298            -> Type) :
    299        GetCurrentNesting(-> CurLev)
    300        LDA(CurLev-Level, Offset)
    301     'rule' Access(object(varparamobj(Offset,Type), Level, Hidden),
    302            Pos -> Type) :
    303        GetCurrentNesting(-> CurLev)
    304        LDA(CurLev-Level, Offset)
    305        LDI
    306     'rule' Access(object(valueparamobj(Offset,Type),Level,Hidden),
    307            Pos -> Type) :
    308        GetCurrentNesting(-> CurLev)
    309        LDA(CurLev-Level, Offset)
    310     'rule' Access(object(procobj(_,_),_,_), Pos -> none) :
    311        Error("procedure not allowed here", Pos)

`Designator`

`Designator(Desig -> Type)` generates code for the designator `Desig` (a construct yielding an address) and computes its type `Type`.

If the designator is a simple identifier, we look up its definition and use `Access` to determine the code and type.

`Access`

`Access(Obj, Pos -> Type)` generates the code to access the object `Obj` and return its type. By way of an example, consider the rule that handles variables:

       'rule' Access(object(varobj(Offset, Type), Level, Hidden), Pos
                     -> Type) :
          GetCurrentNesting(-> CurLev)
          LDA(CurLev-Level, Offset)

The object has the offset `Offset` and the type `Type` ; it was declared on nesting level `Level`. This results in an instruction

          LDA CurLev-Level, Offset

where `CurLevel` is the nesting level of the location where the object is used.

The representation of objects is discussed next.