Compiler.txt 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. MODULE LindevCompiler;
  2. (* THIS IS TEXT COPY OF Compiler.odc *)
  3. (* DO NOT EDIT *)
  4. (*
  5. A. V. Shiryaev, 2012.09
  6. Based on DevCompiler
  7. *)
  8. IMPORT Files, Console, Kernel, Strings,
  9. DevCPM := LindevCPM, DevCPT:= LindevCPT, DevCPB := LindevCPB, DevCPP := LindevCPP,
  10. DevCPE := LindevCPE, DevCPV := LindevCPV486;
  11. CONST
  12. (* compiler options: *)
  13. checks = 0; allchecks = 1; assert = 2; obj = 3; ref = 4; allref = 5; srcpos = 6; reallib = 7; signatures = 8;
  14. hint = 29; oberon = 30; errorTrap = 31;
  15. defopt = {checks, assert, obj, ref, allref, srcpos, signatures};
  16. PROCEDURE WriteInt (x: INTEGER);
  17. VAR s: ARRAY 16 OF CHAR;
  18. BEGIN
  19. Strings.IntToString(x, s);
  20. Console.WriteStr(s)
  21. END WriteInt;
  22. PROCEDURE Module (source: Files.Reader; opt: SET; VAR error: BOOLEAN);
  23. VAR ext, new: BOOLEAN; p: DevCPT.Node;
  24. i: INTEGER;
  25. BEGIN
  26. DevCPM.Init(source);
  27. (* IF found THEN INCL(DevCPM.options, DevCPM.comAware) END; *)
  28. IF errorTrap IN opt THEN INCL(DevCPM.options, DevCPM.trap) END;
  29. IF oberon IN opt THEN INCL(DevCPM.options, DevCPM.oberon) END;
  30. DevCPT.Init(opt);
  31. DevCPB.typSize := DevCPV.TypeSize;
  32. DevCPT.processor := DevCPV.processor;
  33. DevCPP.Module(p);
  34. IF DevCPM.noerr THEN
  35. IF DevCPT.libName # "" THEN EXCL(opt, obj) END;
  36. (*
  37. IF errorTrap IN opt THEN DevCPDump.DumpTree(p) END;
  38. *)
  39. DevCPV.Init(opt); DevCPV.Allocate; DevCPT.Export(ext, new);
  40. IF DevCPM.noerr & (obj IN opt) THEN
  41. DevCPV.Module(p)
  42. END;
  43. DevCPV.Close
  44. END;
  45. IF DevCPM.noerr & (new OR ext) THEN DevCPM.RegisterNewSym
  46. ELSE DevCPM.DeleteNewSym
  47. END;
  48. DevCPT.Close;
  49. error := ~DevCPM.noerr;
  50. DevCPM.Close;
  51. p := NIL;
  52. Kernel.FastCollect;
  53. IF error THEN
  54. IF DevCPM.errors = 1 THEN
  55. Console.WriteStr("one error detected")
  56. ELSE
  57. WriteInt(DevCPM.errors); Console.WriteStr(" errors detected")
  58. END;
  59. Console.WriteLn;
  60. i := 0;
  61. WHILE i < DevCPM.errors DO
  62. Console.WriteStr(" pos = "); WriteInt(DevCPM.errPos[i]); Console.WriteStr(" err = ");
  63. WriteInt(DevCPM.errNo[i]); Console.WriteLn;
  64. INC(i)
  65. END
  66. ELSE
  67. Console.WriteStr(" "); WriteInt(DevCPE.pc); Console.WriteStr(" "); WriteInt(DevCPE.dsize)
  68. END;
  69. Console.WriteLn
  70. END Module;
  71. PROCEDURE Do (IN path, name: ARRAY OF CHAR; opt: SET);
  72. VAR loc: Files.Locator;
  73. f: Files.File; r: Files.Reader; error: BOOLEAN;
  74. BEGIN
  75. loc := Files.dir.This(path);
  76. IF loc # NIL THEN
  77. f := Files.dir.Old(loc, name$, FALSE);
  78. IF f # NIL THEN
  79. r := f.NewReader(NIL);
  80. Module(r, opt, error);
  81. IF error THEN Console.WriteStr("error(s)"); Console.WriteLn END;
  82. f.Close
  83. ELSE
  84. Console.WriteStr("file not found: ");
  85. Console.WriteStr(path); Console.WriteStr(" "); Console.WriteStr(name); Console.WriteLn
  86. END
  87. ELSE
  88. Console.WriteStr("path not found: ");
  89. Console.WriteStr(path); Console.WriteLn
  90. END
  91. END Do;
  92. PROCEDURE Compile* (IN path, name: ARRAY OF CHAR);
  93. BEGIN
  94. Console.WriteStr("compiling ");
  95. Console.WriteStr(path); Console.WriteStr(" "); Console.WriteStr(name);
  96. Console.WriteLn;
  97. Do(path, name, defopt)
  98. END Compile;
  99. PROCEDURE CompileOpt* (IN path, name: ARRAY OF CHAR; IN opt: ARRAY OF CHAR);
  100. VAR loc: Files.Locator;
  101. f: Files.File; r: Files.Reader; error: BOOLEAN; i: INTEGER; opts: SET;
  102. BEGIN
  103. i := 0; opts := defopt;
  104. WHILE opt[i] # 0X DO
  105. IF opt[i] = "-" THEN
  106. IF srcpos IN opts THEN EXCL(opts, srcpos)
  107. ELSIF allref IN opts THEN EXCL(opts, allref)
  108. ELSIF ref IN opts THEN EXCL(opts, ref)
  109. ELSE EXCL(opts, obj)
  110. END
  111. ELSIF opt[i] = "!" THEN
  112. IF assert IN opts THEN EXCL(opts, assert)
  113. ELSE EXCL(opts, checks)
  114. END
  115. ELSIF opt[i] = "+" THEN INCL(opts, allchecks)
  116. ELSIF opt[i] = "?" THEN INCL(opts, hint)
  117. ELSIF opt[i] = "@" THEN INCL(opts, errorTrap)
  118. ELSIF opt[i] = "$" THEN INCL(opts, oberon)
  119. END;
  120. INC(i)
  121. END;
  122. Console.WriteStr("compiling ");
  123. Console.WriteStr(path); Console.WriteStr(" "); Console.WriteStr(name);
  124. IF opt # "" THEN Console.WriteStr(" "); Console.WriteStr(opt); END;
  125. Console.WriteLn;
  126. Do(path, name, opts)
  127. END CompileOpt;
  128. END LindevCompiler.