CodeGen.mod 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. IMPLEMENTATION MODULE CodeGen;
  2. IMPORT FileIO;
  3. VAR
  4. out : FileIO.File;
  5. level : INTEGER;
  6. opened : BOOLEAN;
  7. PROCEDURE Append (VAR dest: ARRAY OF CHAR; src: ARRAY OF CHAR);
  8. VAR i, j : CARDINAL;
  9. BEGIN
  10. i := 0;
  11. WHILE dest[i] # 0C DO INC(i) END;
  12. j := 0;
  13. WHILE (i < HIGH(dest)) & (src[j] # 0C) DO
  14. dest[i] := src[j]; INC(i); INC(j)
  15. END;
  16. dest[i] := 0C
  17. END Append;
  18. PROCEDURE OpenModule (name: ARRAY OF CHAR);
  19. VAR fname : ARRAY [0 .. 127] OF CHAR;
  20. BEGIN
  21. fname[0] := 0C;
  22. Append(fname, "gen/");
  23. Append(fname, name);
  24. Append(fname, ".mod");
  25. FileIO.Open(out, fname, TRUE);
  26. opened := FileIO.Okay;
  27. level := 0;
  28. IF opened THEN
  29. FileIO.WriteString(out, "(* Generated by SimpleM backend *)");
  30. FileIO.WriteLn(out)
  31. END
  32. END OpenModule;
  33. PROCEDURE Close;
  34. BEGIN
  35. IF opened THEN FileIO.Close(out); opened := FALSE END
  36. END Close;
  37. PROCEDURE Emit (s: ARRAY OF CHAR);
  38. BEGIN
  39. IF opened THEN FileIO.WriteString(out, s) END
  40. END Emit;
  41. PROCEDURE Brk;
  42. VAR i : INTEGER;
  43. BEGIN
  44. IF ~opened THEN RETURN END;
  45. FileIO.WriteLn(out);
  46. i := 0;
  47. WHILE i < level * 2 DO FileIO.Write(out, " "); INC(i) END
  48. END Brk;
  49. PROCEDURE Ind;
  50. BEGIN
  51. INC(level)
  52. END Ind;
  53. PROCEDURE Ded;
  54. BEGIN
  55. IF level > 0 THEN DEC(level) END
  56. END Ded;
  57. BEGIN
  58. opened := FALSE;
  59. level := 0
  60. END CodeGen.