Compiler.txt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. MODULE DevCompiler;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Dev/Mod/Compiler.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT Kernel,
  5. Files, Views, Dialog, Controls,
  6. TextModels, TextMappers, TextViews, TextControllers,
  7. StdLog, StdDialog,
  8. DevMarkers, DevCommanders, DevSelectors,
  9. DevCPM, DevCPT, DevCPB, DevCPP, DevCPE, DevCPV := DevCPV486;
  10. CONST
  11. (* compiler options: *)
  12. checks = 0; allchecks = 1; assert = 2; obj = 3; ref = 4; allref = 5; srcpos = 6; reallib = 7; signatures = 8;
  13. hint = 29; oberon = 30; errorTrap = 31;
  14. defopt = {checks, assert, obj, ref, allref, srcpos, signatures};
  15. (* additional scanner types *)
  16. import = 100; module = 101; semicolon = 102; becomes = 103; comEnd = 104;
  17. VAR
  18. sourceR: TextModels.Reader;
  19. s: TextMappers.Scanner;
  20. str: Dialog.String;
  21. found: BOOLEAN; (* DevComDebug was found -> DTC *)
  22. PROCEDURE Module (source: TextModels.Reader; opt: SET; log: TextModels.Model; VAR error: BOOLEAN);
  23. VAR ext, new: BOOLEAN; p: DevCPT.Node;
  24. BEGIN
  25. DevCPM.Init(source, log);
  26. IF found THEN INCL(DevCPM.options, DevCPM.comAware) END;
  27. IF errorTrap IN opt THEN INCL(DevCPM.options, DevCPM.trap) END;
  28. IF oberon IN opt THEN INCL(DevCPM.options, DevCPM.oberon) END;
  29. DevCPT.Init(opt);
  30. DevCPB.typSize := DevCPV.TypeSize;
  31. DevCPT.processor := DevCPV.processor;
  32. DevCPP.Module(p);
  33. IF DevCPM.noerr THEN
  34. IF DevCPT.libName # "" THEN EXCL(opt, obj) END;
  35. (*
  36. IF errorTrap IN opt THEN DevCPDump.DumpTree(p) END;
  37. *)
  38. DevCPV.Init(opt); DevCPV.Allocate; DevCPT.Export(ext, new);
  39. IF DevCPM.noerr & (obj IN opt) THEN
  40. DevCPV.Module(p)
  41. END;
  42. DevCPV.Close
  43. END;
  44. IF DevCPM.noerr & (new OR ext) THEN DevCPM.RegisterNewSym
  45. ELSE DevCPM.DeleteNewSym
  46. END;
  47. DevCPT.Close;
  48. error := ~DevCPM.noerr;
  49. DevCPM.Close;
  50. p := NIL;
  51. Kernel.FastCollect;
  52. IF error THEN
  53. DevCPM.InsertMarks(source.Base());
  54. DevCPM.LogWLn; DevCPM.LogWStr(" ");
  55. IF DevCPM.errors = 1 THEN
  56. Dialog.MapString("#Dev:OneErrorDetected", str)
  57. ELSE
  58. DevCPM.LogWNum(DevCPM.errors, 0); Dialog.MapString("#Dev:ErrorsDetected", str)
  59. END;
  60. StdLog.String(str)
  61. ELSE
  62. IF hint IN opt THEN DevCPM.InsertMarks(source.Base()) END;
  63. DevCPM.LogWStr(" "); DevCPM.LogWNum(DevCPE.pc, 8);
  64. DevCPM.LogWStr(" "); DevCPM.LogWNum(DevCPE.dsize, 8)
  65. END;
  66. DevCPM.LogWLn
  67. END Module;
  68. PROCEDURE Scan (VAR s: TextMappers.Scanner);
  69. BEGIN
  70. s.Scan;
  71. IF s.type = TextMappers.string THEN
  72. IF s.string = "MODULE" THEN s.type := module END
  73. ELSIF s.type = TextMappers.char THEN
  74. IF s.char = "(" THEN
  75. IF s.rider.char = "*" THEN
  76. s.rider.Read;
  77. REPEAT Scan(s) UNTIL (s.type = TextMappers.eot) OR (s.type = comEnd);
  78. Scan(s)
  79. END
  80. ELSIF s.char = "*" THEN
  81. IF s.rider.char = ")" THEN s.rider.Read; s.type := comEnd END
  82. END
  83. END
  84. END Scan;
  85. PROCEDURE Do (source, log: TextModels.Model; beg: INTEGER; opt: SET; VAR error: BOOLEAN);
  86. VAR s: TextMappers.Scanner;
  87. BEGIN
  88. Dialog.MapString("#Dev:Compiling", str);
  89. StdLog.String(str); StdLog.Char(" ");
  90. s.ConnectTo(source); s.SetPos(beg);
  91. Scan(s);
  92. WHILE (s.type # TextMappers.eot) & (s.type # module) DO Scan(s) END;
  93. IF s.type = module THEN
  94. Scan(s);
  95. IF s.type = TextMappers.string THEN
  96. StdLog.Char('"'); StdLog.String(s.string); StdLog.Char('"')
  97. END
  98. END;
  99. sourceR := source.NewReader(NIL); sourceR.SetPos(beg);
  100. Module(sourceR, opt, log, error)
  101. END Do;
  102. PROCEDURE Open;
  103. BEGIN
  104. Dialog.ShowStatus("#Dev:Compiling");
  105. StdLog.buf.Delete(0, StdLog.buf.Length())
  106. END Open;
  107. PROCEDURE Close;
  108. BEGIN
  109. StdLog.text.Append(StdLog.buf);
  110. IF DevCPM.noerr THEN Dialog.ShowStatus("#Dev:Ok")
  111. END;
  112. sourceR := NIL;
  113. Kernel.Cleanup
  114. END Close;
  115. PROCEDURE Compile*;
  116. VAR t: TextModels.Model; error: BOOLEAN;
  117. BEGIN
  118. Open;
  119. t := TextViews.FocusText();
  120. IF t # NIL THEN
  121. Do(t, StdLog.text, 0, defopt, error);
  122. IF error THEN DevMarkers.ShowFirstError(t, TextViews.focusOnly) END
  123. ELSE Dialog.ShowMsg("#Dev:NoTextViewFound")
  124. END;
  125. Close
  126. END Compile;
  127. PROCEDURE CompileOpt* (opt: ARRAY OF CHAR);
  128. VAR t: TextModels.Model; error: BOOLEAN; i: INTEGER; opts: SET;
  129. BEGIN
  130. i := 0; opts := defopt;
  131. WHILE opt[i] # 0X DO
  132. IF opt[i] = "-" THEN
  133. IF srcpos IN opts THEN EXCL(opts, srcpos)
  134. ELSIF allref IN opts THEN EXCL(opts, allref)
  135. ELSIF ref IN opts THEN EXCL(opts, ref)
  136. ELSE EXCL(opts, obj)
  137. END
  138. ELSIF opt[i] = "!" THEN
  139. IF assert IN opts THEN EXCL(opts, assert)
  140. ELSE EXCL(opts, checks)
  141. END
  142. ELSIF opt[i] = "+" THEN INCL(opts, allchecks)
  143. ELSIF opt[i] = "?" THEN INCL(opts, hint)
  144. ELSIF opt[i] = "@" THEN INCL(opts, errorTrap)
  145. ELSIF opt[i] = "$" THEN INCL(opts, oberon)
  146. END;
  147. INC(i)
  148. END;
  149. Open;
  150. t := TextViews.FocusText();
  151. IF t # NIL THEN
  152. Do(t, StdLog.text, 0, opts, error);
  153. IF error THEN DevMarkers.ShowFirstError(t, TextViews.focusOnly) END
  154. ELSE Dialog.ShowMsg("#Dev:NoTextViewFound")
  155. END;
  156. Close
  157. END CompileOpt;
  158. PROCEDURE CompileText* (text: TextModels.Model; beg: INTEGER; OUT error: BOOLEAN);
  159. BEGIN
  160. ASSERT(text # NIL, 20); ASSERT((beg >= 0) & (beg < text.Length()), 21);
  161. Open;
  162. Do(text, StdLog.text, beg, defopt, error);
  163. IF error THEN DevMarkers.ShowFirstError(text, TextViews.focusOnly) END;
  164. Close
  165. END CompileText;
  166. PROCEDURE CompileAndUnload*;
  167. VAR t: TextModels.Model; error: BOOLEAN; mod: Kernel.Module; n: ARRAY 256 OF CHAR;
  168. BEGIN
  169. Open;
  170. t := TextViews.FocusText();
  171. IF t # NIL THEN
  172. Do(t, StdLog.text, 0, defopt, error);
  173. IF error THEN DevMarkers.ShowFirstError(t, TextViews.focusOnly)
  174. ELSE
  175. mod := Kernel.ThisLoadedMod(DevCPT.SelfName);
  176. IF mod # NIL THEN
  177. Kernel.UnloadMod(mod);
  178. n := DevCPT.SelfName$;
  179. IF mod.refcnt < 0 THEN
  180. Dialog.MapParamString("#Dev:Unloaded", n, "", "", str);
  181. StdLog.String(str); StdLog.Ln;
  182. Controls.Relink
  183. ELSE
  184. Dialog.MapParamString("#Dev:UnloadingFailed", n, "", "", str);
  185. StdLog.String(str); StdLog.Ln
  186. END
  187. END
  188. END
  189. ELSE Dialog.ShowMsg("#Dev:NoTextViewFound")
  190. END;
  191. Close
  192. END CompileAndUnload;
  193. PROCEDURE CompileSelection*;
  194. VAR c: TextControllers.Controller; t: TextModels.Model; beg, end: INTEGER; error: BOOLEAN;
  195. BEGIN
  196. Open;
  197. c := TextControllers.Focus();
  198. IF c # NIL THEN
  199. t := c.text;
  200. IF c.HasSelection() THEN
  201. c.GetSelection(beg, end); Do(t, StdLog.text, beg, defopt, error);
  202. IF error THEN DevMarkers.ShowFirstError(t, TextViews.focusOnly) END
  203. ELSE Dialog.ShowMsg("#Dev:NoSelectionFound")
  204. END
  205. ELSE Dialog.ShowMsg("#Dev:NoTextViewFound")
  206. END;
  207. Close
  208. END CompileSelection;
  209. PROCEDURE CompileList (beg, end: INTEGER; c: TextControllers.Controller);
  210. VAR v: Views.View; i: INTEGER; error, one: BOOLEAN; name: Files.Name; loc: Files.Locator;
  211. t: TextModels.Model; opts: SET; title, entry: ARRAY 64 OF CHAR;
  212. BEGIN
  213. s.SetPos(beg); s.Scan; one := FALSE;
  214. WHILE (s.start < end) & (s.type = TextMappers.string) & (s.len < LEN(name)) DO
  215. s.Scan; one := TRUE;
  216. WHILE (s.start < end) & (s.type = TextMappers.char) &
  217. ((s.char = "-") OR (s.char = "+") OR
  218. (s.char = "!") OR (s.char = "*") OR (s.char = "?") OR (s.char = "^") OR (s.char = "("))
  219. DO
  220. IF s.char = "(" THEN
  221. WHILE (s.start < end) & ((s.type # TextMappers.char) OR (s.char # ")")) DO s.Scan END
  222. END;
  223. s.Scan
  224. END
  225. END;
  226. IF one & (s.start >= end) THEN
  227. s.SetPos(beg); s.Scan; error := FALSE;
  228. WHILE (s.start < end) & (s.type = TextMappers.string) & ~error DO
  229. i := 0; WHILE i < LEN(name) DO name[i] := 0X; INC(i) END;
  230. StdDialog.GetSubLoc(s.string, "Mod", loc, name);
  231. t := NIL;
  232. IF loc # NIL THEN
  233. v := Views.OldView(loc, name);
  234. IF v # NIL THEN
  235. WITH v: TextViews.View DO t := v.ThisModel()
  236. ELSE Dialog.ShowParamMsg("#Dev:NoTextFileFound", name, "", ""); error := TRUE
  237. END
  238. ELSE Dialog.ShowParamMsg("#Dev:CannotOpenFile", name, "", ""); error := TRUE
  239. END
  240. ELSE Dialog.ShowParamMsg("#System:FileNotFound", name, "", ""); error := TRUE
  241. END;
  242. s.Scan; opts := defopt;
  243. WHILE (s.start < end) & (s.type = TextMappers.char) DO
  244. IF s.char = "-" THEN
  245. IF srcpos IN opts THEN EXCL(opts, srcpos)
  246. ELSIF allref IN opts THEN EXCL(opts, allref)
  247. ELSIF ref IN opts THEN EXCL(opts, ref)
  248. ELSE EXCL(opts, obj)
  249. END
  250. ELSIF s.char = "!" THEN
  251. IF assert IN opts THEN EXCL(opts, assert)
  252. ELSE EXCL(opts, checks)
  253. END
  254. ELSIF s.char = "+" THEN INCL(opts, allchecks)
  255. ELSIF s.char = "?" THEN INCL(opts, hint)
  256. ELSIF s.char = "@" THEN INCL(opts, errorTrap)
  257. ELSIF s.char = "$" THEN INCL(opts, oberon)
  258. ELSIF s.char = "(" THEN
  259. s.Scan;
  260. WHILE (s.start < end) & (s.type = TextMappers.string) DO
  261. title := s.string$; s.Scan;
  262. IF (s.start < end) & (s.type = TextMappers.char) & (s.char = ":") THEN
  263. s.Scan;
  264. IF (s.start < end) & (s.type = TextMappers.string) THEN
  265. entry := s.string$; s.Scan;
  266. IF t # NIL THEN DevSelectors.ChangeTo(t, title, entry) END
  267. END
  268. END;
  269. IF (s.start < end) & (s.type = TextMappers.char) & (s.char = ",") THEN s.Scan END
  270. END
  271. END;
  272. s.Scan
  273. END;
  274. IF t # NIL THEN
  275. Do(t, StdLog.text, 0, opts, error)
  276. END
  277. END
  278. ELSE Dialog.ShowMsg("#Dev:NotOnlyFileNames")
  279. END;
  280. s.ConnectTo(NIL);
  281. IF error & (c # NIL) & c.HasSelection() & (s.start < end) THEN
  282. c.SetSelection(s.start, end)
  283. END;
  284. IF error & (v # NIL) THEN
  285. Views.Open(v, loc, name, NIL);
  286. DevMarkers.ShowFirstError(t, TextViews.any)
  287. END
  288. END CompileList;
  289. PROCEDURE CompileModuleList*;
  290. VAR c: TextControllers.Controller; beg, end: INTEGER;
  291. BEGIN
  292. Open;
  293. c := TextControllers.Focus();
  294. IF c # NIL THEN
  295. s.ConnectTo(c.text);
  296. IF c.HasSelection() THEN c.GetSelection(beg, end)
  297. ELSE beg := 0; end := c.text.Length()
  298. END;
  299. CompileList(beg, end, c)
  300. ELSE Dialog.ShowMsg("#Dev:NoTextViewFound")
  301. END;
  302. Close
  303. END CompileModuleList;
  304. PROCEDURE CompileThis*;
  305. VAR p: DevCommanders.Par; beg, end: INTEGER;
  306. BEGIN
  307. Open;
  308. p := DevCommanders.par;
  309. IF p # NIL THEN
  310. DevCommanders.par := NIL;
  311. s.ConnectTo(p.text); beg := p.beg; end := p.end;
  312. CompileList(beg, end, NIL)
  313. ELSE Dialog.ShowMsg("#Dev:NoTextViewFound")
  314. END;
  315. Close
  316. END CompileThis;
  317. PROCEDURE Init;
  318. VAR loc: Files.Locator; f: Files.File;
  319. BEGIN
  320. loc := Files.dir.This("Dev"); loc := loc.This("Code");
  321. f := Files.dir.Old(loc, "ComDebug.ocf", TRUE);
  322. found := f # NIL;
  323. IF f # NIL THEN f.Close END
  324. END Init;
  325. BEGIN
  326. Init
  327. END DevCompiler.