| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- IMPLEMENTATION MODULE CRC;
- (* CRC Compiler driver Generation *)
- IMPORT CRA, CRS, CRT, FileIO;
- VAR
- err: FileIO.File; (* output: error message texts *)
- fram: FileIO.File; (* input: parser frame parser.frm *)
- com: FileIO.File; (* output: generated parser *)
- PROCEDURE Put (ch: CHAR);
- BEGIN
- FileIO.Write(com, ch)
- END Put;
- PROCEDURE PutS (s: ARRAY OF CHAR);
- VAR
- i: CARDINAL;
- BEGIN
- i := 0;
- WHILE (i <= HIGH(s)) AND (s[i] # 0C) DO
- IF s[i] = "$"
- THEN FileIO.WriteLn(com)
- ELSE FileIO.Write(com, s[i])
- END;
- INC(i)
- END
- END PutS;
- PROCEDURE WriteDriver;
- VAR
- I, LeftMargin: CARDINAL;
- gn: CRT.GraphNode;
- sn: CRT.SymbolNode;
- gramName: ARRAY [0 .. 31] OF CHAR;
- fGramName, fn, errName, CompilerFrame: ARRAY [0 .. 63] OF CHAR;
- ErrMsg: ARRAY [0 .. 127] OF CHAR;
- BEGIN
- CRT.GetNode(CRT.root, gn); CRT.GetSym(gn.p1, sn);
- FileIO.Extract(sn.name, 0, 8, fn);
- FileIO.Concat(CRS.directory, fn, CompilerFrame);
- FileIO.Concat(CompilerFrame, FileIO.FrmExt, CompilerFrame);
- FileIO.Open(fram, CompilerFrame, FALSE);
- IF ~ FileIO.Okay THEN
- FileIO.Concat(fn, FileIO.FrmExt, CompilerFrame);
- FOR I := 0 TO FileIO.SLENGTH(CompilerFrame) DO
- IF (CompilerFrame[I] >= 'A') & (CompilerFrame[I] <= 'Z')
- THEN CompilerFrame[I] := CHR(ORD(CompilerFrame[I]) + 32)
- END
- END;
- FileIO.Concat(CRS.directory, CompilerFrame, CompilerFrame);
- FileIO.Open(fram, CompilerFrame, FALSE);
- END;
- IF ~ FileIO.Okay THEN
- FileIO.Concat(CRS.directory, "compiler.frm", CompilerFrame);
- FileIO.Open(fram, CompilerFrame, FALSE);
- IF ~ FileIO.Okay THEN
- FileIO.SearchFile(fram, "CRFRAMES", "compiler.frm", FALSE);
- IF ~ FileIO.Okay THEN
- FileIO.WriteLn(FileIO.StdOut);
- FileIO.WriteString(FileIO.StdOut, "'compiler.frm' not found.");
- FileIO.WriteString(FileIO.StdOut, "- Aborted.");
- FileIO.QuitExecution
- END
- END;
- END;
- LeftMargin := 0;
- FileIO.Extract(sn.name, 0, 7, gramName);
- FileIO.Concat(CRS.directory, gramName, fGramName);
- FileIO.Concat(fGramName, FileIO.ErrExt, errName);
- FileIO.Open(err, errName, FALSE);
- IF ~ FileIO.Okay THEN
- FileIO.WriteLn(FileIO.StdOut);
- FileIO.WriteString(FileIO.StdOut, "Cannot find ");
- FileIO.WriteString(FileIO.StdOut, errName);
- FileIO.WriteString(FileIO.StdOut, " - Aborted.");
- FileIO.QuitExecution
- END;
- FileIO.Concat(fGramName, FileIO.ModExt, fn);
- FileIO.Open(com, fn, TRUE);
- IF ~ FileIO.Okay THEN
- FileIO.WriteLn(FileIO.StdOut);
- FileIO.WriteString(FileIO.StdOut, "Cannot open ");
- FileIO.WriteString(FileIO.StdOut, fn);
- FileIO.WriteString(FileIO.StdOut, " - Aborted.");
- FileIO.QuitExecution
- END;
- (* ++
- FileIO.WriteLn(FileIO.StdOut);
- FileIO.WriteString(FileIO.StdOut, " ");
- FileIO.WriteString(FileIO.StdOut, fn);
- ++ *)
- CRA.CopyFramePart("-->Grammar", LeftMargin, fram, com);
- PutS(gramName);
- CRA.CopyFramePart("-->Scanner", LeftMargin, fram, com);
- PutS(gramName); Put("S");
- CRA.CopyFramePart("-->Parser", LeftMargin, fram, com);
- PutS(gramName); Put("P");
- CRA.CopyFramePart("-->Errors", LeftMargin, fram, com);
- FileIO.ReadLine(err, ErrMsg);
- WHILE ~ FileIO.EndOfFile(err) DO
- FileIO.WriteString(com, ErrMsg); FileIO.WriteLn(com);
- FileIO.WriteText(com, "", LeftMargin);
- FileIO.ReadLn(err); FileIO.ReadLine(err, ErrMsg)
- END;
- CRA.CopyFramePart("-->Grammar", LeftMargin, fram, com);
- PutS(gramName);
- CRA.CopyFramePart("-->$$$", LeftMargin, fram, com);
- FileIO.Close(com);
- FileIO.Close(err);
- FileIO.Close(fram);
- END WriteDriver;
- END CRC.
|