[NEXT] [PREV]    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(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(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.