CRC.mod 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. IMPLEMENTATION MODULE CRC;
  2. (* CRC Compiler driver Generation *)
  3. IMPORT CRA, CRS, CRT, FileIO;
  4. VAR
  5. err: FileIO.File; (* output: error message texts *)
  6. fram: FileIO.File; (* input: parser frame parser.frm *)
  7. com: FileIO.File; (* output: generated parser *)
  8. PROCEDURE Put (ch: CHAR);
  9. BEGIN
  10. FileIO.Write(com, ch)
  11. END Put;
  12. PROCEDURE PutS (s: ARRAY OF CHAR);
  13. VAR
  14. i: CARDINAL;
  15. BEGIN
  16. i := 0;
  17. WHILE (i <= HIGH(s)) AND (s[i] # 0C) DO
  18. IF s[i] = "$"
  19. THEN FileIO.WriteLn(com)
  20. ELSE FileIO.Write(com, s[i])
  21. END;
  22. INC(i)
  23. END
  24. END PutS;
  25. PROCEDURE WriteDriver;
  26. VAR
  27. I, LeftMargin: CARDINAL;
  28. gn: CRT.GraphNode;
  29. sn: CRT.SymbolNode;
  30. gramName: ARRAY [0 .. 31] OF CHAR;
  31. fGramName, fn, errName, CompilerFrame: ARRAY [0 .. 63] OF CHAR;
  32. ErrMsg: ARRAY [0 .. 127] OF CHAR;
  33. BEGIN
  34. CRT.GetNode(CRT.root, gn); CRT.GetSym(gn.p1, sn);
  35. FileIO.Extract(sn.name, 0, 8, fn);
  36. FileIO.Concat(CRS.directory, fn, CompilerFrame);
  37. FileIO.Concat(CompilerFrame, FileIO.FrmExt, CompilerFrame);
  38. FileIO.Open(fram, CompilerFrame, FALSE);
  39. IF ~ FileIO.Okay THEN
  40. FileIO.Concat(fn, FileIO.FrmExt, CompilerFrame);
  41. FOR I := 0 TO FileIO.SLENGTH(CompilerFrame) DO
  42. IF (CompilerFrame[I] >= 'A') & (CompilerFrame[I] <= 'Z')
  43. THEN CompilerFrame[I] := CHR(ORD(CompilerFrame[I]) + 32)
  44. END
  45. END;
  46. FileIO.Concat(CRS.directory, CompilerFrame, CompilerFrame);
  47. FileIO.Open(fram, CompilerFrame, FALSE);
  48. END;
  49. IF ~ FileIO.Okay THEN
  50. FileIO.Concat(CRS.directory, "compiler.frm", CompilerFrame);
  51. FileIO.Open(fram, CompilerFrame, FALSE);
  52. IF ~ FileIO.Okay THEN
  53. FileIO.SearchFile(fram, "CRFRAMES", "compiler.frm", FALSE);
  54. IF ~ FileIO.Okay THEN
  55. FileIO.WriteLn(FileIO.StdOut);
  56. FileIO.WriteString(FileIO.StdOut, "'compiler.frm' not found.");
  57. FileIO.WriteString(FileIO.StdOut, "- Aborted.");
  58. FileIO.QuitExecution
  59. END
  60. END;
  61. END;
  62. LeftMargin := 0;
  63. FileIO.Extract(sn.name, 0, 7, gramName);
  64. FileIO.Concat(CRS.directory, gramName, fGramName);
  65. FileIO.Concat(fGramName, FileIO.ErrExt, errName);
  66. FileIO.Open(err, errName, FALSE);
  67. IF ~ FileIO.Okay THEN
  68. FileIO.WriteLn(FileIO.StdOut);
  69. FileIO.WriteString(FileIO.StdOut, "Cannot find ");
  70. FileIO.WriteString(FileIO.StdOut, errName);
  71. FileIO.WriteString(FileIO.StdOut, " - Aborted.");
  72. FileIO.QuitExecution
  73. END;
  74. FileIO.Concat(fGramName, FileIO.ModExt, fn);
  75. FileIO.Open(com, fn, TRUE);
  76. IF ~ FileIO.Okay THEN
  77. FileIO.WriteLn(FileIO.StdOut);
  78. FileIO.WriteString(FileIO.StdOut, "Cannot open ");
  79. FileIO.WriteString(FileIO.StdOut, fn);
  80. FileIO.WriteString(FileIO.StdOut, " - Aborted.");
  81. FileIO.QuitExecution
  82. END;
  83. (* ++
  84. FileIO.WriteLn(FileIO.StdOut);
  85. FileIO.WriteString(FileIO.StdOut, " ");
  86. FileIO.WriteString(FileIO.StdOut, fn);
  87. ++ *)
  88. CRA.CopyFramePart("-->Grammar", LeftMargin, fram, com);
  89. PutS(gramName);
  90. CRA.CopyFramePart("-->Scanner", LeftMargin, fram, com);
  91. PutS(gramName); Put("S");
  92. CRA.CopyFramePart("-->Parser", LeftMargin, fram, com);
  93. PutS(gramName); Put("P");
  94. CRA.CopyFramePart("-->Errors", LeftMargin, fram, com);
  95. FileIO.ReadLine(err, ErrMsg);
  96. WHILE ~ FileIO.EndOfFile(err) DO
  97. FileIO.WriteString(com, ErrMsg); FileIO.WriteLn(com);
  98. FileIO.WriteText(com, "", LeftMargin);
  99. FileIO.ReadLn(err); FileIO.ReadLine(err, ErrMsg)
  100. END;
  101. CRA.CopyFramePart("-->Grammar", LeftMargin, fram, com);
  102. PutS(gramName);
  103. CRA.CopyFramePart("-->$$$", LeftMargin, fram, com);
  104. FileIO.Close(com);
  105. FileIO.Close(err);
  106. FileIO.Close(fram);
  107. END WriteDriver;
  108. END CRC.