home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pmos2002.zip / DOC / PP.DOC < prev    next >
Text File  |  1996-08-11  |  11KB  |  269 lines

  1.                 PP - Preprocessor for Modula-2 programs
  2.                 =======================================
  3.  
  4. This software is freeware.  You may use it without paying a fee, and
  5. you may distribute it freely, subject only to the condition that this
  6. documentation file be included with the redistribution.  You may not
  7. sell it.
  8.  
  9.                        DISCLAIMER OF WARRANTY
  10.  
  11.     LIKE ALL FREE SOFTWARE, THIS PACKAGE IS PROVIDED "AS IS",  AND
  12.     WITHOUT WARRANTIES AS TO PERFORMANCE OR FITNESS FOR A
  13.     PARTICULAR PURPOSE.  YOU MAY USE THIS SOFTWARE ONLY IF YOU
  14.     ACCEPT THE RISK OF USING IT.
  15.  
  16. The function of this software is to convert files from one format
  17. to another.  To cover the possibility that the conversion fails, you
  18. are strongly advised to keep backup copies of the files to be
  19. processed.
  20.  
  21. If you modify the program to extend its functionality, it would be
  22. appreciated if you could send a copy of the modified version to the
  23. author (see contact information at the end of this document).
  24.  
  25.  
  26. WHAT THE PROGRAM DOES
  27.  
  28. This program is intended for use in situations where you have to
  29. maintain multiple versions of Modula-2 source code, for example
  30. because you want to support a variety of hardware configurations,
  31. or because you use language features that are not consistent from
  32. one compiler to another.  When using PP you maintain just one master
  33. copy of each module, containing code for all versions; and you run
  34. PP each time you want to process the master copy to produce a
  35. specific version of that module.
  36.  
  37. Three files are needed to run PP:
  38.        PP.EXE  The executable form of the preprocessor
  39.        PP.CFG  A "configuration file" which specifies which versions
  40.                are to be made active.  The rules for writing a PP.CFG
  41.                file are given later in this document.
  42.        PP.FIL  A file containing a list of file names.  This is the
  43.                specification of which files are to be converted.
  44.  
  45. Sample copies of PP.CFG and PP.FIL are included in this distribution.
  46.  
  47.  
  48. VERSION CONTROL DELIMITERS
  49.  
  50. You write the master copy of a module as a normal Modula-2 module.
  51. The version control delimiters are embedded in the source file as
  52. Modula-2 comments:
  53.  
  54.      (*<expr     marks the start of a section which is to be made
  55.                  active iff "expr" evaluates to TRUE.  The rules for
  56.                  forming an "expr" are given in a later section.
  57.      >*)         marks the end of a section.
  58.  
  59. Version control sections may be nested.  Note that, by the normal rules
  60. for forming Modula-2 comments, a section delimited as above is
  61. "commented out" as far as the Modula-2 compiler is concerned.  This
  62. is for an inactive section.  If, however, the starting marker is
  63. (*<expr*) and the end marker is (*>*), the version control delimiters
  64. themselves are commented out, so that the enclosed section is seen by
  65. the compiler.  All that PP is doing is adding and removing comment
  66. delimiters in the file being processed, so that some sections are
  67. commented out and others are made visible.
  68.  
  69. Example: suppose that a section of the source file looks as follows.
  70.  
  71.        (*<FST IMPORT Strings; >*)
  72.        (*<TopSpeed*) IMPORT Str; (*>*)
  73.        (*<MouseKind=Serial
  74.         IMPORT SerialMouse;
  75.        >*)
  76.        (*<MouseKind=INT33
  77.         IMPORT Mouse33;
  78.        >*)
  79.  
  80. As it stands, the only "active" part of this file is the part that
  81. says "IMPORT Str"; everything else is commented out.  If now we set
  82. up a PP.CFG file that specifies
  83.  
  84.        -- Example PP.CFG
  85.        FST
  86.        MouseKind := Serial
  87.  
  88. and then process the module with PP, the result will be
  89.  
  90.        (*<FST*) IMPORT Strings; (*>*)
  91.        (*<TopSpeed IMPORT Str; >*)
  92.        (*<MouseKind=Serial*)
  93.         IMPORT SerialMouse;
  94.        (*>*)
  95.        (*<MouseKind=INT33
  96.         IMPORT Mouse33;
  97.        >*)
  98.  
  99. Because the comment markers have changed, the compiler now sees a
  100. different version of the source.
  101.  
  102. If PP is run with the command
  103.        PP S
  104. (where the "S" stands for "strip"), inactive versions are physically
  105. deleted rather than being commented out.  In that case the final
  106. result, for the above example, would be
  107.  
  108.         IMPORT Strings;
  109.         IMPORT SerialMouse;
  110.  
  111. Although this is easier to read, there is a disadvantage: the resulting
  112. file can no longer be used as a master version.  Because of this the
  113. "S" option is less appropriate in most applications.
  114.  
  115. This example has illustrated the use of PP for controlling IMPORT
  116. declarations.  Of course, that is not its only application.  You can
  117. use version control sections anywhere in the file being processed.
  118. The only requirement is that you avoid the use of mismatched comment
  119. delimiters.
  120.  
  121.  
  122. EXPRESSION SYNTAX
  123.  
  124. Note that you have to include an expression after the delimiter (*<.
  125. The expression is formed according to the following syntax.
  126.  
  127.           expr  ->   term { | term }
  128.           term  ->   factor { & factor }
  129.           factor ->  id
  130.           factor ->  id = id
  131.           factor ->  id <> id
  132.           factor ->  ( expr )
  133.           factor ->  ~ factor
  134.  
  135. Here the notation { ... } means zero or more repetitions of what
  136. is inside the { }.
  137.  
  138. An "id" can be up to 32 characters long, where each character may be
  139. a letter or a digit.  (Leading digits are legal.)  Case is significant.
  140. The value of an "id" is obtained as follows:
  141.  
  142.   1. If the "id" has been assigned a value in PP.CFG, then that value
  143.      (as a string constant) is used.
  144.   2. Otherwise, the "id" is taken to be a string literal constant.
  145.   3. Where a string is placed in parentheses, or is used as an operand
  146.      of a Boolean expression, or is to be evaluated as the final result
  147.      of a Boolean expression, then the special string "TRUE" is interpreted
  148.      as Boolean TRUE, and everything else is interpreted as FALSE.
  149.  
  150.         NOTE: For compatibility with an earlier version of PP, the
  151.         symbols "T" and "F" are predefined to have values "TRUE" and
  152.         "FALSE" respectively.  This redundancy might not be carried
  153.         forward into future versions of PP.
  154.  
  155. The Boolean operators are
  156.         |  (Boolean OR)          &  (Boolean AND)       ~  (Boolean NOT)
  157. The comparison operators are
  158.         =  (string equality)           <>  (string inequality)
  159.  
  160. An expression may not contain space characters.
  161.  
  162.  
  163. FORMAT OF THE PP.CFG FILE
  164.  
  165. Each non-blank, non-comment line in PP.CFG should consist of a single
  166. assignment, which can have one of two forms
  167.  
  168.           id := expr
  169.           id
  170.  
  171. The second form, where an identifier is written on its own, is
  172. a shorthand notation for the assignment
  173.  
  174.           id := TRUE
  175.  
  176. Spaces are not permitted inside an "expr", but they are legal
  177. everywhere else.  Blank lines are legal.  Comments start with --
  178. and finish at the end of the line.  A comment may stand on a line of
  179. its own or may come after an assignment.
  180.  
  181. Expressions are evaluated as explained in the previous section.
  182. An "id" that has been given a value in an assignment statement is
  183. treated as a variable, and one that has not been used on the left side
  184. of an assignment is treated as a string literal.  Note that one-pass
  185. processing is used, so that for example in the sequence
  186.  
  187.          alpha := beta
  188.          beta := TRUE
  189.  
  190. the variable beta ends up with the value "TRUE", but alpha has the
  191. string value "beta".  Try to avoid examples like this, because they
  192. can cause confusion.
  193.  
  194.  
  195. RECOMPILING THE SUPPLIED SOURCES
  196.  
  197. The complete source for PP is supplied in this distribution.  There
  198. are four modules: PP, PPExpr, PPMisc, and PPTextIO.  (The module PPTextIO
  199. is for use with the FST compiler, and might not be needed if you use
  200. some other compiler.  In some of the distributed versions the
  201. PPTextIO module is omitted.)  The modules PP and PPExpr are, in principle,
  202. portable across all compilers.  (If you find an exception, please let
  203. me know.)  PPMisc holds the compiler-dependent stuff.
  204.  
  205. The code has been tested with TopSpeed version 1.17, TopSpeed version
  206. 3.10, FST, and XDS.  There are also some hooks in there for the Rowley
  207. compiler, but since I don't have that compiler the Rowley code is
  208. guesswork and probably wrong.
  209.  
  210. Since PP.EXE is included in this distribution, you don't really need
  211. the source code ... but I imagine that you'll want to convert it
  212. for your compiler anyway.  To do this:
  213.  
  214.    (a) save a copy of all supplied files in another directory, just in
  215.        case the following steps fail.
  216.    (b) edit the supplied PP.CFG to change the defined symbol to one
  217.        of XDS, FST, Rowley, or TopSpeed, as appropriate.  (If your compiler
  218.        is not one of these, see below.)
  219.    (c) Run PP.  This will modify PPMISC.DEF and PPMISC.MOD.  You now
  220.        have a copy suitable for use with your compiler; and you can
  221.        re-compile and re-make PP.EXE if desired.
  222.  
  223. What if you have a compiler other than the ones mentioned above?
  224. In this case you should manually edit PPMISC.DEF and PPMISC.MOD, to
  225. insert new sections using the existing code as a guide.  (This will
  226. be easy - this module consists mainly of library calls.)  Then
  227. proceed as above.
  228.  
  229.  
  230. KNOWN BUGS
  231.  
  232. The one known fault in PP is that its logic for deciding when to
  233. copy a blank line is imperfect.  With the command-line "S"
  234. option, you can get extra blank lines internally in cases where a
  235. complete line has had to be deleted.  Since this is a benign fault,
  236. I haven't given a high priority to fixing it.
  237.  
  238.  
  239. CREDITS
  240.  
  241. The version control syntax of PP is similar to, although not identical
  242. with, the syntax used by the "version" utility that came with Rowley
  243. Modula-2.  I don't know whether the idea is older with that.  (I don't
  244. have any of the Rowley software, only a few pages of manual.)  PP
  245. extends the syntax by allowing more complex combinations of conditions.
  246.  
  247. The immediate predecessor of PP was a program developed at Monash
  248. University and supplied to me by Deane Blackman.  I've re-coded this
  249. almost completely to add new features, but this project would not even
  250. have been started if Deane had not pointed me in the right direction.
  251.  
  252.  
  253. CONTACT INFORMATION
  254.  
  255. The author of PP is
  256.  
  257.             Peter Moylan
  258.             Department of Electrical and Computer Engineering
  259.             The University of Newcastle, NSW 2308
  260.             Australia.
  261.  
  262.             Phone: +61 49 21 6023      (time zone GMT+10)
  263.             Fax:   +61 49 60 1712
  264.             e-mail:   peter@ee.newcastle.edu.au
  265.  
  266. The preferred method of contacting me is via e-mail; this will probably
  267. bring a faster response than with paper mail.  I would very much like
  268. to hear of ports of PP to other compilers.
  269.