home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Modula / Utilities / Makefiles / MakeParser.MOD < prev    next >
Encoding:
Modula Implementation  |  1988-01-24  |  6.0 KB  |  173 lines  |  [TEXT/????]

  1. IMPLEMENTATION MODULE MakeParser;
  2.  
  3.   (*
  4.    * MAKEMAKE.  Create a MAKEFILE for a MODULA-2 program.
  5.    *
  6.    * Written by Steve Tynor, 30 September 1986.
  7.    *            UUCP  : tynor@gitpyr
  8.    *            USNAIL: 2550 Akers Mill Rd. T-2, Atlanta GA. 30339
  9.    *
  10.    * Permission is granted to distribute, copy and change this program as long
  11.    * as this notice remains...
  12.    ---
  13.    *
  14.    * Make.
  15.    * Modified and extended for MacMETH by :
  16.    * J?rgen N?rgaard, 23 october 1987.
  17.    *            UUCP  : jnp@daimi.dk
  18.    *            MAIL  : Dybb?lvej 29, v?r. 2+3, 8240 Risskov, DENMARK
  19.    *
  20.    * Essentially only the parser remains from the original.
  21.    * Extensions are a dependency-tree and a make-like facility.
  22.    *
  23.    *)
  24.  
  25. IMPORT System;
  26. IMPORT StringLib0;
  27. IMPORT MakeForest;
  28. IMPORT MakeToken;
  29. IMPORT MakeLibraries;
  30.  
  31. IMPORT InOut;
  32.   (*----------------------------------------------------------------------*)
  33.   PROCEDURE ModulenameToFilename (VAR modulename : ARRAY OF CHAR;
  34.                                       defOrMod   : FileType;
  35.                                   VAR fname      : ARRAY OF CHAR);
  36.   CONST
  37.     EOS = 0C;
  38.   VAR
  39.     c : INTEGER;
  40.   BEGIN
  41.     c := 0;
  42.     WHILE (c < HIGH(modulename)) AND (c <= (HIGH(fname) - 4))
  43.           AND (modulename[c] <> EOS) DO
  44.       fname[c] := modulename[c];
  45.       INC (c);
  46.     END; (* WHILE *)
  47.     fname[c] := '.';
  48.     IF defOrMod = def THEN
  49.       fname[c+1] := 'D'; fname[c+2] := 'E'; fname[c+3] := 'F'; 
  50.       fname[c+4] := EOS;
  51.     ELSE
  52.       fname[c+1] := 'M'; fname[c+2] := 'O'; fname[c+3] := 'D';
  53.       fname[c+4] := EOS;
  54.     END; (* IF *)
  55.   END ModulenameToFilename;
  56.  
  57.   (*----------------------------------------------------------------------*)
  58.   PROCEDURE TerminatingToken(VAR token : ARRAY OF CHAR) : BOOLEAN;
  59.   VAR
  60.     temp : BOOLEAN;
  61.   BEGIN
  62.     (* had to split up due to compiler limitation... *)
  63.     temp := StringLib0.Equal (token, 'CONST') OR
  64.             StringLib0.Equal (token, 'TYPE')  OR
  65.             StringLib0.Equal (token, 'VAR')   OR
  66.             StringLib0.Equal (token, 'MODULE');
  67.     RETURN  temp OR
  68.             StringLib0.Equal (token, 'PROCEDURE') OR
  69.             StringLib0.Equal (token, 'BEGIN')     OR
  70.             StringLib0.Equal (token, 'END');
  71.   END TerminatingToken;
  72.  
  73.   (*----------------------------------------------------------------------*)
  74.   PROCEDURE ParseFROM (  VAR dp       : MakeForest.DepTree;
  75.                          VAR eof      : BOOLEAN;
  76.                          VAR filename : System.Path;
  77.                          VAR succeded   : BOOLEAN);
  78.   VAR
  79.     modulename : MakeForest.NameString;
  80.     de : MakeForest.EntityPtr;
  81.   BEGIN
  82.     MakeToken.NextToken (modulename, eof);
  83.     IF MakeForest.AddModule(modulename, dp, de) THEN
  84.       ParseModule (modulename, def, de, filename, succeded);
  85.       ParseModule (modulename, mod, de, filename, succeded);
  86.     END;
  87.     MakeToken.SkipTillSemicolon (eof);
  88.   END ParseFROM;
  89.  
  90.   (*----------------------------------------------------------------------*)
  91.   PROCEDURE ParseIMPORT ( VAR dp       : MakeForest.DepTree;
  92.                           VAR eof      : BOOLEAN;
  93.                           VAR filename : System.Path;
  94.                          VAR succeded   : BOOLEAN);
  95.   VAR
  96.     modulename : MakeForest.NameString;
  97.     de : MakeForest.EntityPtr;
  98.   BEGIN
  99.     MakeToken.NextToken (modulename, eof);
  100.     WHILE (modulename[0] <> ';') AND succeded DO
  101.       IF MakeForest.AddModule(modulename, dp, de) THEN
  102.         ParseModule (modulename, def, de, filename, succeded);
  103.         ParseModule (modulename, mod, de, filename, succeded);
  104.       END;
  105.       MakeToken.NextToken (modulename, eof);
  106.     END; (* WHILE *)
  107.   END ParseIMPORT;
  108.  
  109.   (*----------------------------------------------------------------------*)
  110.   PROCEDURE ParseModule (VAR modulename : MakeForest.NameString;
  111.                              type       : FileType;
  112.                          VAR de         : MakeForest.EntityPtr;
  113.                          VAR filename   : System.Path;
  114.                          VAR succeded   : BOOLEAN);
  115.   VAR 
  116.     token    : ARRAY [0 .. 132] OF CHAR;
  117.     success,
  118.     eof      : BOOLEAN;
  119.     tempName : System.Path;
  120.   BEGIN
  121.     ModulenameToFilename (modulename, type, filename);
  122.     succeded := TRUE;
  123.     IF MakeLibraries.IsALibraryModule (modulename) THEN
  124.       de^.library := TRUE;
  125.       InOut.WriteString(modulename);
  126.       InOut.WriteString(' (Library)');
  127.       InOut.WriteLn;
  128.     ELSE
  129.       MakeToken.OpenFile (filename, success);
  130.       IF type = def THEN
  131.         de^.defName := filename;
  132.       ELSE
  133.         de^.impName := filename;
  134.       END;
  135.       InOut.WriteString('- ');
  136.       InOut.WriteString(filename);
  137.       IF NOT success THEN
  138.         InOut.WriteString(', File Not Found'); InOut.WriteLn;
  139.         succeded := FALSE;
  140.       ELSE
  141.         MakeToken.NextToken (token, eof);
  142.         IF    (type = def) AND NOT StringLib0.Equal(token, 'DEFINITION') THEN
  143.           InOut.WriteString('Expected a "DEFINITION"-MODULE');
  144.         ELSIF (type = mod) AND NOT StringLib0.Equal(token, 'IMPLEMENTATION') THEN
  145.           InOut.WriteString('Expected a "IMPLEMENTATION"-MODULE');
  146.         ELSIF (type = main) AND NOT StringLib0.Equal(token, 'MODULE') THEN
  147.           InOut.WriteString('Expected a "MODULE"-MODULE');
  148.         END; (* IF / ELSE / ENDIF *)
  149.         InOut.WriteLn;
  150.         MakeToken.SkipTillSemicolon (eof);
  151.         token := ';';
  152.         WHILE (NOT eof) AND (NOT TerminatingToken(token)) DO
  153.           IF StringLib0.Equal (token, 'FROM') THEN
  154.             IF type = def THEN
  155.               ParseFROM (de^.DEFDepends, eof, tempName, succeded);
  156.             ELSE
  157.               ParseFROM (de^.MODDepends, eof, tempName, succeded);
  158.             END;
  159.           ELSIF StringLib0.Equal (token, 'IMPORT') THEN
  160.             IF type = def THEN
  161.               ParseIMPORT (de^.DEFDepends, eof, tempName, succeded);
  162.             ELSE
  163.               ParseIMPORT (de^.MODDepends, eof, tempName, succeded);
  164.             END;
  165.           END; (* IF *)
  166.           MakeToken.NextToken (token, eof);
  167.         END; (* WHILE *)
  168.       END; (* IF file opened *)
  169.       MakeToken.CloseFile;
  170.     END;(* IF ELSE we need to check this one *)
  171.   END ParseModule;
  172. END MakeParser.
  173.