Interpreter.txt 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. MODULE StdInterpreter;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Std/Mod/Interpreter.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT Kernel, Meta, Strings, Views, Dialog;
  5. TYPE
  6. IntValue = POINTER TO RECORD (Meta.Value)
  7. int: INTEGER;
  8. END;
  9. StrValue = POINTER TO RECORD (Meta.Value)
  10. str: Dialog.String;
  11. END;
  12. CallHook = POINTER TO RECORD (Dialog.CallHook) END;
  13. PROCEDURE (hook: CallHook) Call (IN proc, errorMsg: ARRAY OF CHAR; VAR res: INTEGER);
  14. TYPE Ident = ARRAY 32 OF CHAR;
  15. CONST
  16. modNotFound = 10; procNotFound = 11; identExpected = 12; unknownIdent = 13;
  17. depositExpected = 14; noDepositExpected = 15; syntaxError = 16;
  18. lparenExpected = 17; rparenExpected = 18; containerExpected = 19; quoteExpected = 20;
  19. fileNotFound = 21; noController = 22; noDialog = 23; cannotUnload = 24; commaExpected = 25;
  20. incompParList = 26;
  21. CONST
  22. ident = 0; dot = 1; semicolon = 2; eot = 3; lparen = 4; rparen = 5; quote = 6; comma = 7; int = 8;
  23. VAR
  24. i, type: INTEGER; ch: CHAR; id: Ident; x: INTEGER;
  25. par: ARRAY 100 OF POINTER TO Meta.Value; numPar: INTEGER;
  26. PROCEDURE Concat (a, b: ARRAY OF CHAR; VAR c: ARRAY OF CHAR);
  27. VAR i, j: INTEGER; ch: CHAR;
  28. BEGIN
  29. IF a = " " THEN Dialog.MapString("#System:CommandError", c) ELSE c := a$ END;
  30. i := 0; WHILE c[i] # 0X DO INC(i) END;
  31. c[i] := " "; INC(i);
  32. j := 0; ch := b[0]; WHILE ch # 0X DO c[i] := ch; INC(i); INC(j); ch := b[j] END;
  33. c[i] := 0X
  34. END Concat;
  35. PROCEDURE Error (n: INTEGER; msg, par0, par1: ARRAY OF CHAR);
  36. VAR e, f: ARRAY 256 OF CHAR;
  37. BEGIN
  38. IF res = 0 THEN
  39. res := n;
  40. IF errorMsg # "" THEN
  41. Dialog.MapString(errorMsg, e);
  42. Dialog.MapParamString(msg, par0, par1, "", f);
  43. Concat(e, f, f);
  44. Dialog.ShowMsg(f)
  45. END
  46. END
  47. END Error;
  48. PROCEDURE Init (VAR s: ARRAY OF CHAR);
  49. VAR i: INTEGER;
  50. BEGIN
  51. i := 0; WHILE i < LEN(s) DO s[i] := 0X; INC(i) END
  52. END Init;
  53. PROCEDURE ShowLoaderResult (IN mod: ARRAY OF CHAR);
  54. VAR res: INTEGER; importing, imported, object: ARRAY 256 OF CHAR;
  55. BEGIN
  56. Kernel.GetLoaderResult(res, importing, imported, object);
  57. CASE res OF
  58. | Kernel.fileNotFound:
  59. Error(Kernel.fileNotFound, "#System:CodeFileNotFound", imported, "")
  60. | Kernel.syntaxError:
  61. Error(Kernel.syntaxError, "#System:CorruptedCodeFileFor", imported, "")
  62. | Kernel.objNotFound:
  63. Error(Kernel.objNotFound, "#System:ObjNotFoundImpFrom", imported, importing)
  64. | Kernel.illegalFPrint:
  65. Error(Kernel.illegalFPrint, "#System:ObjInconsImpFrom", imported, importing)
  66. | Kernel.cyclicImport:
  67. Error(Kernel.cyclicImport, "#System:CyclicImpFrom", imported, importing)
  68. | Kernel.noMem:
  69. Error(Kernel.noMem, "#System:NotEnoughMemoryFor", imported, "")
  70. ELSE
  71. Error(res, "#System:CannotLoadModule", mod, "")
  72. END
  73. END ShowLoaderResult;
  74. PROCEDURE CallProc (IN mod, proc: ARRAY OF CHAR);
  75. VAR i, t: Meta.Item; ok: BOOLEAN;
  76. BEGIN
  77. ok := FALSE;
  78. Meta.Lookup(mod, i);
  79. IF i.obj = Meta.modObj THEN
  80. i.Lookup(proc, i);
  81. IF i.obj = Meta.procObj THEN
  82. i.GetReturnType(t);
  83. IF (t.typ = 0) & (i.NumParam() = numPar) THEN
  84. i.ParamCallVal(par, t, ok)
  85. ELSE ok := FALSE
  86. END;
  87. IF ~ok THEN
  88. Error(incompParList, "#System:IncompatibleParList", mod, proc)
  89. END
  90. ELSE
  91. Error(Kernel.commNotFound, "#System:CommandNotFoundIn", proc, mod)
  92. END
  93. ELSE
  94. ShowLoaderResult(mod)
  95. END
  96. END CallProc;
  97. PROCEDURE GetCh;
  98. BEGIN
  99. IF i < LEN(proc) THEN ch := proc[i]; INC(i) ELSE ch := 0X END
  100. END GetCh;
  101. PROCEDURE Scan;
  102. VAR j: INTEGER; num: ARRAY 32 OF CHAR; r: INTEGER;
  103. BEGIN
  104. IF res = 0 THEN
  105. WHILE (ch # 0X) & (ch <= " ") DO GetCh END;
  106. IF ch = 0X THEN
  107. type := eot
  108. ELSIF ch = "." THEN
  109. type := dot; GetCh
  110. ELSIF ch = ";" THEN
  111. type := semicolon; GetCh
  112. ELSIF ch = "(" THEN
  113. type := lparen; GetCh
  114. ELSIF ch = ")" THEN
  115. type := rparen; GetCh
  116. ELSIF ch = "'" THEN
  117. type := quote; GetCh
  118. ELSIF ch = "," THEN
  119. type := comma; GetCh
  120. ELSIF (ch >= "0") & (ch <= "9") OR (ch = "-") THEN
  121. type := int; j := 0;
  122. REPEAT num[j] := ch; INC(j); GetCh UNTIL (ch < "0") OR (ch > "9") & (ch < "A") OR (ch > "H");
  123. num[j] := 0X; Strings.StringToInt(num, x, r)
  124. ELSIF (ch >= "a") & (ch <= "z") OR (ch >= "A") & (ch <= "Z") OR
  125. (ch >= 0C0X) & (ch # "×") & (ch # "÷") & (ch <= 0FFX) OR (ch = "_") THEN
  126. type := ident;
  127. id[0] := ch; j := 1; GetCh;
  128. WHILE (ch # 0X) & (i < LEN(proc)) &
  129. ((ch >= "a") & (ch <= "z") OR (ch >= "A") & (ch <= "Z") OR
  130. (ch >= 0C0X) & (ch # "×") & (ch # "÷") & (ch <= 0FFX) OR
  131. (ch = "_") OR (ch >= "0") & (ch <= "9")) DO
  132. id[j] := ch; INC(j); GetCh
  133. END;
  134. id[j] := 0X
  135. ELSE Error(syntaxError, "#System:SyntaxError", "", "")
  136. END
  137. END
  138. END Scan;
  139. PROCEDURE String (VAR s: ARRAY OF CHAR);
  140. VAR j: INTEGER;
  141. BEGIN
  142. IF type = quote THEN
  143. j := 0;
  144. WHILE (ch # 0X) & (ch # "'") & (j < LEN(s) - 1) DO s[j] := ch; INC(j); GetCh END; s[j] := 0X;
  145. IF ch = "'" THEN
  146. GetCh; Scan
  147. ELSE Error(quoteExpected, "#System:QuoteExpected", "", "")
  148. END
  149. ELSE Error(quoteExpected, "#System:QuoteExpected", "", "")
  150. END
  151. END String;
  152. PROCEDURE ParamList ();
  153. VAR iv: IntValue; sv: StrValue;
  154. BEGIN
  155. numPar := 0;
  156. IF type = lparen THEN Scan;
  157. WHILE (numPar < LEN(par)) & (type # rparen) & (res = 0) DO
  158. IF type = quote THEN
  159. NEW(sv);
  160. String(sv.str);
  161. par[numPar] := sv;
  162. INC(numPar)
  163. ELSIF type = int THEN
  164. NEW(iv);
  165. iv.int := x; Scan;
  166. par[numPar] := iv;
  167. INC(numPar)
  168. ELSE Error(syntaxError, "#System:SyntaxError", "", "")
  169. END;
  170. IF type = comma THEN Scan
  171. ELSIF type # rparen THEN Error(rparenExpected, "#System:RParenExpected", "", "")
  172. END
  173. END;
  174. Scan
  175. END
  176. END ParamList;
  177. PROCEDURE Command;
  178. VAR left, right: Ident;
  179. BEGIN
  180. (* protect from parasitic anchors on stack *)
  181. Init(left); Init(right);
  182. left := id; Scan;
  183. IF type = dot THEN (* Oberon command *)
  184. Scan;
  185. IF type = ident THEN
  186. right := id; Scan; ParamList();
  187. CallProc(left, right)
  188. ELSE Error(identExpected, "#System:IdentExpected", "", "")
  189. END
  190. ELSE Error(unknownIdent, "#System:UnknownIdent", id, "")
  191. END
  192. END Command;
  193. BEGIN
  194. (* protect from parasitic anchors on stack *)
  195. i := 0; type := 0; Init(id); x := 0;
  196. Views.ClearQueue;
  197. res := 0; i := 0; GetCh;
  198. Scan;
  199. IF type = ident THEN
  200. Command; WHILE (type = semicolon) & (res = 0) DO Scan; Command END;
  201. IF type # eot THEN Error(syntaxError, "#System:SyntaxError", "", "") END
  202. ELSE Error(syntaxError, "#System:SyntaxError", "", "")
  203. END;
  204. IF (res = 0) & (Views.Available() > 0) THEN
  205. Error(noDepositExpected, "#System:NoDepositExpected", "", "")
  206. END;
  207. Views.ClearQueue
  208. END Call;
  209. PROCEDURE Init;
  210. VAR hook: CallHook;
  211. BEGIN
  212. NEW(hook); Dialog.SetCallHook(hook)
  213. END Init;
  214. BEGIN
  215. Init
  216. END StdInterpreter.