Module.ob 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. MODULE Module;
  2. IMPORT Code, Context, Errors, JsArray, LanguageContext, Procedure, Symbols, Types;
  3. TYPE
  4. Type* = RECORD(Types.Module)
  5. PROCEDURE findSymbol(id: STRING): Symbols.PFoundSymbol
  6. END;
  7. PType* = POINTER TO Type;
  8. AnyType* = RECORD(Types.StorageType)
  9. PROCEDURE callGenerator(cx: LanguageContext.PType): Procedure.PCallGenerator;
  10. PROCEDURE denote(id: STRING): Types.PField;
  11. PROCEDURE designatorCode(id: STRING): STRING;
  12. asField: POINTER TO AnyField;
  13. asVar: Types.PId
  14. END;
  15. AnyField = RECORD(Types.Field)
  16. END;
  17. AnyTypeProc* = RECORD(Types.DefinedProcedure)
  18. END;
  19. JS = RECORD(Type)
  20. END;
  21. VAR
  22. doProcId, varTypeId: STRING;
  23. any: POINTER TO AnyType;
  24. anyProc: AnyTypeProc;
  25. doProcSymbol, varTypeSymbol: Symbols.PSymbol;
  26. PROCEDURE AnyType.description(): STRING;
  27. RETURN "JS.var"
  28. END AnyType.description;
  29. PROCEDURE AnyType.initializer(cx: Context.Type; forNew: BOOLEAN): STRING;
  30. RETURN "undefined"
  31. END AnyType.initializer;
  32. PROCEDURE AnyType.callGenerator(cx: LanguageContext.PType): Procedure.PCallGenerator;
  33. RETURN Procedure.makeProcCallGenerator(cx, anyProc)
  34. END AnyType.callGenerator;
  35. PROCEDURE AnyType.denote(id: STRING): Types.PField;
  36. RETURN any.asField
  37. END AnyType.denote;
  38. PROCEDURE AnyType.designatorCode(id: STRING): STRING;
  39. RETURN id
  40. END AnyType.designatorCode;
  41. PROCEDURE AnyField.id(): STRING;
  42. RETURN "any field"
  43. END AnyField.id;
  44. PROCEDURE AnyField.exported(): BOOLEAN;
  45. RETURN FALSE
  46. END AnyField.exported;
  47. PROCEDURE AnyField.type(): Types.PType;
  48. RETURN any
  49. END AnyField.type;
  50. PROCEDURE AnyField.asVar(): Types.PId;
  51. RETURN any.asVar
  52. END AnyField.asVar;
  53. PROCEDURE AnyTypeProc.args(): JsArray.Type;
  54. RETURN NIL
  55. END AnyTypeProc.args;
  56. PROCEDURE AnyTypeProc.result(): Types.PType;
  57. RETURN any
  58. END AnyTypeProc.result;
  59. PROCEDURE JS.findSymbol(id: STRING): Symbols.PFoundSymbol;
  60. VAR
  61. result: Symbols.PSymbol;
  62. BEGIN
  63. IF id = doProcId THEN
  64. result := doProcSymbol;
  65. ELSIF id = varTypeId THEN
  66. result := varTypeSymbol;
  67. ELSE
  68. result := Symbols.makeSymbol(id, Types.makeProcedure(any));
  69. END;
  70. RETURN Symbols.makeFound(result, NIL)
  71. END JS.findSymbol;
  72. PROCEDURE makeVarTypeSymbol(): Symbols.PSymbol;
  73. RETURN Symbols.makeSymbol(varTypeId, Types.makeTypeId(any))
  74. END makeVarTypeSymbol;
  75. PROCEDURE makeDoProcSymbol(): Symbols.PSymbol;
  76. TYPE
  77. Call = RECORD(Procedure.StdCall)
  78. END;
  79. Proc = RECORD(Procedure.Std)
  80. END;
  81. VAR
  82. description: STRING;
  83. call: POINTER TO Call;
  84. proc: POINTER TO Proc;
  85. PROCEDURE Call.make(args: JsArray.Type; cx: LanguageContext.Type): Code.PExpression;
  86. VAR
  87. arg: Code.PExpression;
  88. type: Types.PType;
  89. BEGIN
  90. arg := Procedure.checkSingleArgument(args, SELF, cx.types);
  91. type := arg.type();
  92. IF ~(type IS Types.PString) THEN
  93. Errors.raise("string is expected as an argument of "
  94. + description + ", got " + type.description());
  95. END;
  96. RETURN Code.makeSimpleExpression(Types.stringValue(type(Types.PString)^), NIL)
  97. END Call.make;
  98. PROCEDURE Proc.description(): STRING;
  99. RETURN description
  100. END Proc.description;
  101. BEGIN
  102. description := "JS predefined procedure 'do'";
  103. NEW(call);
  104. Procedure.initStdCall(call);
  105. Procedure.hasArgumentWithCustomType(call);
  106. NEW(proc);
  107. Procedure.initStd("", call, proc^);
  108. RETURN Procedure.makeSymbol(proc)
  109. END makeDoProcSymbol;
  110. PROCEDURE makeJS*(): PType;
  111. VAR
  112. result: POINTER TO JS;
  113. BEGIN
  114. NEW(result);
  115. Types.initModule(result^, "this");
  116. RETURN result
  117. END makeJS;
  118. BEGIN
  119. doProcId := "do$";
  120. varTypeId := "var$";
  121. NEW(any);
  122. NEW(any.asField);
  123. any.asVar := Types.makeTypeId(any);
  124. doProcSymbol := makeDoProcSymbol();
  125. varTypeSymbol := makeVarTypeSymbol();
  126. END Module.