ObjectTable.mod 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. IMPLEMENTATION MODULE ObjectTable; (* gf 27.04.89 (pl0) *)
  2. FROM Storage IMPORT ALLOCATE;
  3. FROM Synthesis IMPORT SemanticError;
  4. FROM StringTable IMPORT InsertIdent, SameId;
  5. FROM Scanner IMPORT IDENT, POSITION, dummyPosition;
  6. FROM ErrorHandling IMPORT PrintError2;
  7. CONST maxlev = 15;
  8. VAR curlev : CARDINAL;
  9. undef : Object;
  10. topScope : Object;
  11. PROCEDURE Error(n : CARDINAL; p : POSITION);
  12. BEGIN
  13. SemanticError := TRUE; PrintError2(n, p)
  14. END Error;
  15. PROCEDURE EnterDecl(id: IDENT; pos: POSITION): Object;
  16. VAR obj : Object;
  17. BEGIN
  18. (* check for multiple definition *)
  19. obj := topScope^.nextObj;
  20. WHILE obj # NIL DO
  21. IF SameId(id, obj^.id) THEN
  22. Error(25, pos);
  23. RETURN undef
  24. END;
  25. obj := obj^.nextObj
  26. END;
  27. (* now enter new object into list *)
  28. NEW(obj);
  29. obj^.id := id;
  30. WITH obj^ DO
  31. level := curlev;
  32. kind := newObject;
  33. nextObj := NIL
  34. END;
  35. topScope^.lastObj^.nextObj := obj;
  36. topScope^.lastObj := obj;
  37. RETURN obj
  38. END EnterDecl;
  39. PROCEDURE FindDecl(id : IDENT; pos : POSITION) : Object;
  40. VAR hd, obj : Object;
  41. BEGIN
  42. hd := topScope;
  43. WHILE hd # NIL DO
  44. obj := hd^.nextObj;
  45. WHILE obj # NIL DO
  46. IF SameId(id, obj^.id) THEN
  47. RETURN obj
  48. ELSE
  49. obj := obj^.nextObj;
  50. END
  51. END;
  52. hd := hd^.down;
  53. END;
  54. Error(11, pos);
  55. RETURN undef
  56. END FindDecl;
  57. PROCEDURE GetObjType(obj : Object) : ObjType;
  58. BEGIN
  59. CASE obj^.kind OF
  60. undefined : RETURN Undefined
  61. | simpleType : RETURN ObjType(obj)
  62. | constant : RETURN ObjType(obj^.cType)
  63. | variable : RETURN ObjType(obj^.vType)
  64. ELSE
  65. RETURN Undefined
  66. END
  67. END GetObjType;
  68. PROCEDURE EnterBlock(): CARDINAL;
  69. VAR hd : Object;
  70. BEGIN
  71. INC(curlev);
  72. NEW(hd);
  73. WITH hd^ DO
  74. kind := block;
  75. nextObj := NIL;
  76. lastObj := hd;
  77. id := IDENT(0);
  78. down := topScope
  79. END;
  80. topScope := hd;
  81. RETURN curlev
  82. END EnterBlock;
  83. PROCEDURE LeaveBlock(): CARDINAL;
  84. VAR Obj : Object;
  85. BEGIN
  86. topScope := topScope^.down;
  87. DEC(curlev);
  88. RETURN curlev
  89. END LeaveBlock;
  90. PROCEDURE InitObjectTable(): CARDINAL;
  91. VAR i : CARDINAL;
  92. VAR obj : Object;
  93. VAR hd : Object;
  94. BEGIN
  95. curlev := 0;
  96. NEW(hd);
  97. WITH hd^ DO
  98. kind := block;
  99. nextObj := NIL;
  100. lastObj := hd;
  101. (* id := IDENT(0); *)
  102. id := 0;
  103. down := NIL
  104. END;
  105. topScope := hd;
  106. obj := EnterDecl(InsertIdent("INTEGER"), dummyPosition);
  107. obj^.kind := simpleType;
  108. Integer := obj;
  109. RETURN curlev
  110. END InitObjectTable;
  111. BEGIN
  112. NEW(undef);
  113. WITH undef^ DO
  114. id := -1;
  115. nextObj := NIL;
  116. level := 0;
  117. kind := undefined;
  118. END;
  119. Undefined := ObjType(undef);
  120. END ObjectTable.