| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- IMPLEMENTATION MODULE CodeGen;
- IMPORT FileIO;
- VAR
- out : FileIO.File;
- level : INTEGER;
- opened : BOOLEAN;
- PROCEDURE Append (VAR dest: ARRAY OF CHAR; src: ARRAY OF CHAR);
- VAR i, j : CARDINAL;
- BEGIN
- i := 0;
- WHILE dest[i] # 0C DO INC(i) END;
- j := 0;
- WHILE (i < HIGH(dest)) & (src[j] # 0C) DO
- dest[i] := src[j]; INC(i); INC(j)
- END;
- dest[i] := 0C
- END Append;
- PROCEDURE OpenModule (name: ARRAY OF CHAR);
- VAR fname : ARRAY [0 .. 127] OF CHAR;
- BEGIN
- fname[0] := 0C;
- Append(fname, "gen/");
- Append(fname, name);
- Append(fname, ".mod");
- FileIO.Open(out, fname, TRUE);
- opened := FileIO.Okay;
- level := 0;
- IF opened THEN
- FileIO.WriteString(out, "(* Generated by SimpleM backend *)");
- FileIO.WriteLn(out)
- END
- END OpenModule;
- PROCEDURE Close;
- BEGIN
- IF opened THEN FileIO.Close(out); opened := FALSE END
- END Close;
- PROCEDURE Emit (s: ARRAY OF CHAR);
- BEGIN
- IF opened THEN FileIO.WriteString(out, s) END
- END Emit;
- PROCEDURE Brk;
- VAR i : INTEGER;
- BEGIN
- IF ~opened THEN RETURN END;
- FileIO.WriteLn(out);
- i := 0;
- WHILE i < level * 2 DO FileIO.Write(out, " "); INC(i) END
- END Brk;
- PROCEDURE Ind;
- BEGIN
- INC(level)
- END Ind;
- PROCEDURE Ded;
- BEGIN
- IF level > 0 THEN DEC(level) END
- END Ded;
- BEGIN
- opened := FALSE;
- level := 0
- END CodeGen.
|