home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / print / afmt2.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-05-03  |  165.6 KB  |  3,160 lines

  1. (*====================================================================*)
  2. (*                                                                    *)
  3. (*  PROGRAM TITLE: ADA PRETTYPRINTING PROGRAM                         *)
  4. (*                                                                    *)
  5. (*  AUTHORS: MARLOW HENNE AIR FORCE ARMANENT LABORATORY(DLMM) AND     *)
  6. (*           LARRY NEAL, GENERAL RESEARCH CORP,FT WALTON BEACH,FLA    *)
  7. (*                                                                    *)
  8. (*  HISTORY: MODIFIED BY RICK CONN (LOOK FOR -- RLC --) TO SUPPORT    *)
  9. (*           CAPITALIZATION OF KEYWORDS OR IDENTIFIERS.               *)
  10. (*           ALSO CORRECTED AN ERROR IN THE NUMBER PARSER (GETNUMBER) *)
  11. (*           DEALING WITH THE EVALUATION OF BASED NUMBERS.            *)
  12. (*           ALSO CORRECTED A PROBLEM WITH INDENTATION (SEE -- RLC -- *)
  13. (*           IN INITIALIZE ROUTINE).                                  *)
  14. (*           ALSO ADDED SEVERAL MORE RESERVED WORDS SO CASE           *)
  15. (*           CONVERSION IS MORE EFFECTIVE (SEE -- RLC --).            *)
  16. (*  HISTORY: MODIFIED BY ALAN WOODY TO COMPENSATE FOR TAB CHARACTERS  *)
  17. (*           USED IN THE PLACE OF SPACES IN THE INPUT FILE (LOOK FOR  *)
  18. (*           CAW  ). MODIFIED TO HANDLE INSTANTIATIONS OF GENERIC     *)
  19. (*           PACKAGES, AND MODIFIED TO HANDLE with function STATEMENTS*)
  20. (*           ALSO MODIFIED TO HANDLE PRIVATE TYPE STATEMENTS. SEE     *)
  21. (*           COMMENTS BELOW FOR THE ADDED VARIABLES AND THEIR PURPOSE.*)
  22. (*  HISTORY: THIS PROGRAM IS AN ADAPTION OF A PASCAL PRETTYPRINTER    *)
  23. (*           WRITTEN ORIGINALLY BY JON F. HUERAS AND HENRY F.         *)
  24. (*           LEDGARDOF THE COMPUTER AND INFORMATION SCIENCE DEPARTMENT*)
  25. (*           UNIVERSITY OF MASSACHUSETTS, AMHERST IN AUGUST 1976,     *)
  26. (*           WITH EARLIER VERSIONS AND CONTRIBUTIONS BY RNADY CHOW    *)
  27. (*           AND JOHN GORMAN.  CONTRIBUTIONS TO THE ORIGNIAL PASCAL   *)
  28. (*           WAS ALSO MADE TO MODIFY IT FOR THE CDC-6000 PASCAL       *)
  29. (*           RELEASE 3 BY RICK L. MARCUS,UNIVERSITY COMPUTER CENTER,  *)
  30. (*           UNIVERSITY OF MINNESOTA IN SEPTEMBER 1978.               *)
  31. (*                                                                    *)
  32. (*  PROGRAM SUMMARY:                                                  *)
  33. (*                                                                    *)
  34. (*     THIS PROGRAM TAKES AS INPUT AN ADA PROGRAM AND                 *)
  35. (*     REFORMATS THE PROGRAM ACCORDING TO A STANDARD SET OF           *)
  36. (*     PRETTYPRINTING RULES. THE PRETTYPRINTED PROGRAM IS GIVEN       *)
  37. (*     AS OUTPUT.  THE PRETTYPRINTING RULES ARE GIVEN BELOW.          *)
  38. (*                                                                    *)
  39. (*     NO ATTEMPT IS MADE TO DETECT OR CORRECT SYNTACTIC ERRORS IN    *)
  40. (*     THE USER'S PROGRAM.  HOWEVER, SYNTACTIC ERRORS MAY RESULT IN   *)
  41. (*     ERRONEOUS PRETTYPRINTING.                                      *)
  42. (*                                                                    *)
  43. (*                                                                    *)
  44. (*  INPUT FILE: INPUT   - A FILE OF CHARACTERS, PRESUMABLY AN         *)
  45. (*                        ADA PROGRAM OR PROGRAM FRAGMENT.            *)
  46. (*                                                                    *)
  47. (*  OUTPUT FILE: OUTPUT - THE PRETTYPRINTED PROGRAM.                  *)
  48. (*                                                                    *)
  49. (*  PROCEURES/FUNCTIONS USED                                          *)
  50. (*                          INITIALIZE                                *)
  51. (*                          GETSYMBOL                                 *)
  52. (*                          INSERTCR                                  *)
  53. (*                          INSERTBLANKLINE                           *)
  54. (*                          LSHIFT                                    *)
  55. (*                          INSERTSPACE                               *)
  56. (*                          PPSYMBOL                                  *)
  57. (*                          RSHIFT                                    *)
  58. (*                          GOBBLE                                    *)
  59. (*                          STACKFULL                                 *)
  60. (*                          PUSHSTACK                                 *)
  61. (*                                                                    *)
  62. (*====================================================================*)
  63. (*====================================================================*)
  64. (*                                                                    *)
  65. (*                    ADA PRETTYPRINTING RULES                        *)
  66. (*                                                                    *)
  67. (*                                                                    *)
  68. (*  [ GENERAL PRETTYPRINTING RULES ]                                  *)
  69. (*                                                                    *)
  70. (*   1.   COMMENTS ARE LEFT WHERE THEY ARE FOUND, UNLESS              *)
  71. (*     THEY ARE SHIFTED RIGHT BY PRECEEDING TEXT ON A LINE.           *)
  72. (*                                                                    *)
  73. (*   2.   ALL STATEMENTS AND DECLARATIONS BEGIN ON SEPARATE LINES     *)
  74. (*     WITH ONE EXCEPTION BEING THE CONTEXT_SPECIFICATION USING A     *)
  75. (*     WITH_CLAUSE AND A USE_CLAUSE.  FOR EXAMPLE THE FOLLOWING       *)
  76. (*     CONTEXT_SPECIFICATION WOULD APPEAR ON THE SAME LINE:           *)
  77. (*                                                                    *)
  78. (*       WITH TEXT_IO, REAL_OPERATIONS; USE REAL_OPERATIONS;          *)
  79. (*                                                                    *)
  80. (*                                                                    *)
  81. (*   3.   NO LINE MAY BE GREATER THAN 80 CHARACTERS LONG.  ANY LINE   *)
  82. (*     LONGER THAN THIS IS CONTINUED ON A SEPARATE LINE.              *)
  83. (*                                                                    *)
  84. (*   4.  THE KEYWORDS                                                 *)
  85. (*          "BEGIN"                                                   *)
  86. (*          "LOOP"(EXCEPT WHEN USED FOLLOWING A ITERATION CLAUSE)     *)
  87. (*          "ELSE"                                                    *)
  88. (*          "DECLARE"                                                 *)
  89. (*          "EXCEPTION"(EXCEPT WHEN USED AS AN EXCEPTION_DECLARATION  *)
  90. (*                      OR AS A RENAMING_DECLARATION)                 *)
  91. (*          "SELECT"                                                  *)
  92. (*          "PRIVATE"(EXCEPT WHEN USED AS A PRIVATE_TYPE_DEFINITION)  *)
  93. (*          "GENERIC"                                                 *)
  94. (*          "OR"(EXCEPT WHEN USED AS A LOGICAL_OPERATOR)              *)
  95. (*       ARE FORCED TO STAND ON LINES BY THEMSELVES(OR POSSIBLY       *)
  96. (*       FOLLOWED BY SUPPORTING COMMENTS)                             *)
  97. (*                                                                    *)
  98. (*   5.   A BLANK LINE IS FORCED BEFORE THE KEYWORDS                  *)
  99. (*     "PROCEDURE", "FUNCTION", "PACKAGE", "EXCEPTION",               *)
  100. (*     "TASK", "GENERIC", AND "PRIVATE"(EXCEPT WHEN USED              *)
  101. (*     AS A PRIVATE_TYPE_DECLARATION)                                 *)
  102. (*   6.   A SPACE IS FORCED BEFORE AND AFTER THE SYMBOLS ":=".        *)
  103. (*     ADDITIONALLY, A SPACE IS FORCED AFTER THE SYMBOL ":".          *)
  104. (*   7.  THE FOLLOWING SYNTATIC CHANGE IS FORCED BY THE PRETTYPRINTER *)
  105. (*     PROGRAM:                                                       *)
  106. (*            END [ IDENTIFIER] ::= END IDENTIFIER                    *)
  107. (*   8.  THE FOLLOWING SIMPLE STATEMENTS BEGIN ON A SEPARATE LINE     *)
  108. (*     BUT DO NOT AFFECT INDENTATION:                                 *)
  109. (*                                                                    *)
  110. (*           ASSIGNMENT_STATEMENTS                                    *)
  111. (*           RETURN_STATEMENTS                                        *)
  112. (*           EXIT_STATEMENTS                                          *)
  113. (*           GOTO_STATEMENTS                                          *)
  114. (*           PROCEDURE_CALLS                                          *)
  115. (*           RAISE_STATEMENTS                                         *)
  116. (*           CODE_STATEMENTS                                          *)
  117. (*           ENTRY_CALL_STATEMENTS                                    *)
  118. (*           ABORT_STATEMENTS                                         *)
  119. (*           DELAY_STATEMENTS                                         *)
  120. (*           NULL_STATEMENTS                                          *)
  121. (*   9.  THE FOLLOWING COMPOUND STATEMENTS ARE INDENTED               *)
  122. (*       AS FOLLOWS:                                                  *)
  123. (*                                                                    *)
  124. (*          A. GENERAL IF_STATEMENTS                                  *)
  125. (*                                                                    *)
  126. (*             IF CONDITION THEN                                      *)
  127. (*                SEQUENCE_OF_STATEMENTS                              *)
  128. (*             ELSIF CONDITION THEN                                   *)
  129. (*                SEQUENCE_OF_STATEMENTS                              *)
  130. (*              .                                                     *)
  131. (*              .                                                     *)
  132. (*             ELSE                                                   *)
  133. (*                SEQUENCE_OF_STATEMENTS                              *)
  134. (*             END IF;                                                *)
  135. (*                                                                    *)
  136. (*          B. GENERAL CASE_STATEMENTS                                *)
  137. (*                                                                    *)
  138. (*             CASE EXPRESSION IS                                     *)
  139. (*                WHEN CHOICE =>                                      *)
  140. (*                   SEQUENCE_OF_STATEMENTS                           *)
  141. (*                 .                                                  *)
  142. (*                 .                                                  *)
  143. (*                WHEN CHOICE =>                                      *)
  144. (*                   SEQUENCE_OF_STATEMENTS                           *)
  145. (*                WHEN OTHERS =>                                      *)
  146. (*                   SEQUENCE_OF_STATEMENTS                           *)
  147. (*                END CASE;                                           *)
  148. (*                                                                    *)
  149. (*         C. GENERAL LOOP_STATEMENTS                                 *)
  150. (*                                                                    *)
  151. (*            1.  BASIC_LOOP                                          *)
  152. (*                                                                    *)
  153. (*               LOOP                                                 *)
  154. (*                  SEQUENCE_OF_STATEMENTS                            *)
  155. (*               END LOOP;                                            *)
  156. (*                                                                    *)
  157. (*            2.  FOR_LOOP                                            *)
  158. (*                                                                    *)
  159. (*                FOR LOOP_PARAMETER IN DISCRETE_RANGE LOOP           *)
  160. (*                   SEQUENCE_OF_STATEMENTS                           *)
  161. (*                END LOOP;                                           *)
  162. (*                                                                    *)
  163. (*            3.  WHILE_LOOP                                          *)
  164. (*                                                                    *)
  165. (*                WHILE CONDITION LOOP                                *)
  166. (*                   SEQUENCE_OF_STATEMENTS                           *)
  167. (*                END LOOP;                                           *)
  168. (*                                                                    *)
  169. (*         D.  GENERAL ACCEPT_STATEMENTS                              *)
  170. (*                                                                    *)
  171. (*             ACCEPT ENTRY_NAME [ FORMAL_PART ] DO                   *)
  172. (*                SEQUENCE_OF_STATEMENTS                              *)
  173. (*             END ENTRY_NAME;                                        *)
  174. (*                                                                    *)
  175. (*         E.  GENERAL SELECT_STATEMENTS                              *)
  176. (*                                                                    *)
  177. (*             1.  SELECTIVE_WAIT STATEMENTS                          *)
  178. (*                                                                    *)
  179. (*                 SELECT                                             *)
  180. (*                 WHEN CONDITION =>                                  *)
  181. (*                    SELECT_ALTERNATIVE                              *)
  182. (*                 OR                                                 *)
  183. (*                 WHEN CONDITION =>                                  *)
  184. (*                    SELECT_ALTERNATIVE                              *)
  185. (*                 ELSE                                               *)
  186. (*                    SEQUENCE_OF_STATEMENTS                          *)
  187. (*                 END SELECT;                                        *)
  188. (*                                                                    *)
  189. (*             2.  CONDITIONAL_ENTRY_CALL STATEMENTS                  *)
  190. (*                                                                    *)
  191. (*                 SELECT                                             *)
  192. (*                    ENTRY_CALL;                                     *)
  193. (*                 ELSE                                               *)
  194. (*                    SEQUENCE_OF_STATEMENTS                          *)
  195. (*                 END SELECT;                                        *)
  196. (*                                                                    *)
  197. (*             3.  TIMED_ENTRY_CALL STATEMENTS                        *)
  198. (*                                                                    *)
  199. (*                 SELECT                                             *)
  200. (*                    ENTRY_CALL;                                     *)
  201. (*                    SEQUENCE_OF_STATEMENTS                          *)
  202. (*                 OR                                                 *)
  203. (*                    DELAY_STATEMENT                                 *)
  204. (*                    SEQUENCE_OF_STATEMENTS                          *)
  205. (*                 END SELECT;                                        *)
  206. (*                                                                    *)
  207. (*         F.  BLOCKS                                                 *)
  208. (*                                                                    *)
  209. (*             BLOCKNAME:                                             *)
  210. (*             DECLARE                                                *)
  211. (*                DECLARATIVE_PART                                    *)
  212. (*             BEGIN                                                  *)
  213. (*                SEQUENCE_OF_STATEMENTS                              *)
  214. (*             END BLOCKNAME;                                         *)
  215. (*                                                                    *)
  216. (*====================================================================*)
  217. (*====================================================================*)
  218. (*                      GENERAL ALGORITHM                             *)
  219. (*                                                                    *)
  220. (*                                                                    *)
  221. (*      THE STRATEGY OF THE PRETTYPRINTER IS TO SCAN SYMBOLS FROM     *)
  222. (*   THE INPUT PROGRAM AND MAP EACH SYMBOL INTO A PRETTYPRINTING      *)
  223. (*   ACTION, INDEPENDENTLY OF THE CONTEXT IN WHICH THE SYMBOL         *)
  224. (*   APPEARS.  THIS IS ACCOMPLISHED BY A TABLE OF PRETTYPRINTING      *)
  225. (*   OPTIONS.                                                         *)
  226. (*                                                                    *)
  227. (*      FOR EACH DISTINGUISHED SYMBOL IN THE TABLE, THERE IS AN       *)
  228. (*   ASSOCIATED SET OF OPTIONS.  IF THE OPTION HAS BEEN SELECTED FOR  *)
  229. (*   THE SYMBOL BEING SCANNED, THEN THE ACTION CORRESPONDING WITH     *)
  230. (*   EACH OPTION IS PERFORMED.                                        *)
  231. (*                                                                    *)
  232. (*      THE BASIC ACTIONS INVOLVED IN PRETTYPRINTING ARE THE INDENT-  *)
  233. (*   ATION AND DE-INDENTATION OF THE MARGIN.  EACH TIME THE MARGIN IS *)
  234. (*   INDENTED, THE PREVIOUS VALUE OF THE MARGIN IS PUSHED ONTO A      *)
  235. (*   STACK, ALONG WITH THE NAME OF THE SYMBOL THAT CAUSED IT TO BE    *)
  236. (*   INDENTED.  EACH TIME THE MARGIN IS DE-INDENTED, THE STACK IS     *)
  237. (*   POPPED OFF TO OBTAIN THE PREVIOUS VALUE OF THE MARGIN.           *)
  238. (*                                                                    *)
  239. (*      THE PRETTYPRINTING OPTIONS ARE PROCESSED IN THE FOLLOWING     *)
  240. (*   ORDER, AND INVOKE THE FOLLOWING ACTIONS:                         *)
  241. (*                                                                    *)
  242. (*                                                                    *)
  243. (*     CRSUPPRESS      - IF A CARRIAGE RETURN HAS BEEN INSERTED       *)
  244. (*                       FOLLOWING THE PREVIOUS SYMBOL, THEN IT IS    *)
  245. (*                       INHIBITED UNTIL THE NEXT SYMBOL IS PRINTED.  *)
  246. (*                                                                    *)
  247. (*     CRBEFORE        - A CARRIAGE RETURN IS INSERTED BEFORE THE     *)
  248. (*                       CURRENT SYMBOL (UNLESS ONE IS ALREADY THERE) *)
  249. (*                                                                    *)
  250. (*     BLANKLINEBEFORE - A BLANK LINE IS INSERTED BEFORE THE CURRENT  *)
  251. (*                       SYMBOL (UNLESS ALREADY THERE).               *)
  252. (*                                                                    *)
  253. (*     DINDENT         - THE STACK IS UNCONDITIONALLY POPPED AND THE  *)
  254. (*                       MARGIN IS DE-INDENTED.                       *)
  255. (*                                                                    *)
  256. (*     SPACEBEFORE     - A SPACE IS INSERTED BEFORE THE SYMBOL BEING  *)
  257. (*                       SCANNED (UNLESS ALREADY THERE).              *)
  258. (*                                                                    *)
  259. (*     [ THE SYMBOL IS PRINTED AT THIS POINT ]                        *)
  260. (*                                                                    *)
  261. (*     SPACEAFTER      - A SPACE IS INSERTED AFTER THE SYMBOL BEING   *)
  262. (*                       SCANNED (UNLESS ALREADY THERE).              *)
  263. (*                                                                    *)
  264. (*     GOBBLESYMBOLS   - SYMBOLS ARE CONTINUOUSLY SCANNED AND PRINTED *)
  265. (*                       WITHOUT ANY PROCESSING UNTIL ONE OF THE      *)
  266. (*                       SPECIFIED SYMBOLS IS SEEN (BUT NOT GOBBLED). *)
  267. (*                                                                    *)
  268. (*     INDENTBYTAB     - THE MARGIN IS INDENTED BY A STANDARD AMOUNT  *)
  269. (*                       FROM THE PREVIOUS MARGIN.                    *)
  270. (*                                                                    *)
  271. (*     INDENTMARGIN    - THE MARGIN IS INDENTED BY A STANDARD AMOUNT  *)
  272. (*                       FROM THE PREVIOUS MARGIN.                    *)
  273. (*                                                                    *)
  274. (*     CRAFTER         - A CARRIAGE RETURN IS INSERTED FOLLOWING THE  *)
  275. (*                       SYMBOL SCANNED.                              *)
  276. (*                                                                    *)
  277. (*                                                                    *)
  278. (*                                                                    *)
  279. (*====================================================================*)
  280. PROGRAM PRETTYPRINT( (* FROM *)  INPUT,
  281.                      (* TO *)    OUTPUT );
  282. CONST
  283.       CAPITALIZEID  = TRUE;  (* CAPITALIZE IDENTIFIERS - TRUE MAKES   *)
  284.                              (* THEM CAPS, FALSE MAKES THEM LOWER     *)
  285.       CAPITALIZEKEY = FALSE; (* CAPITALIZE KEYWORDS - TRUE MAKES THEM *)
  286.                              (* CAPS, FALSE MAKES THEM LOWER          *)
  287.       MAXSYMBOLSIZE = 200; (* THE MAXIMUM SIZE (IN CHARACTERS) OF A   *)
  288.                            (* SYMBOL SCANNED BY THE LEXICAL SCANNER.  *)
  289.       MAXSTACKSIZE  = 50;  (* THE MAXIMUM NUMBER OF SYMBOLS CAUSING   *)
  290.                            (* INDENTATION THAT MAY BE STACKED.        *)
  291.       MAXKEYLENGTH  =  10; (* THE MAXIMUM LENGTH (IN CHARACTERS) OF A *)
  292.                            (* PASCAL RESERVED KEYWORD.                *)
  293.       MAXLINESIZE   =  80; (* THE MAXIMUM SIZE (IN CHARACTERS) OF A   *)
  294.                            (* LINE OUTPUT BY THE PRETTYPRINTER.       *)
  295.       SLOFAIL1      =  30; (* UP TO THIS COLUMN POSITION, EACH TIME   *)
  296.                            (* "INDENTBYTAB" IS INVOKED, THE MARGIN    *)
  297.                            (* WILL BE INDENTED BY "INDENT1".          *)
  298.       SLOFAIL2      =  72; (* UP TO THIS COLUMN POSITION, EACH TIME   *)
  299.                            (* "INDENTBYTAB" IS INVOKED, THE MARGIN    *)
  300.                            (* WILL BE INDENTED BY "INDENT2".  BEYOND  *)
  301.                            (* THIS, NO INDENTATION OCCURS.            *)
  302.       INDENT1       =   3; (* UP TO THE COLUMN POSTION,SLOFAIL1, EACH *)
  303.                            (* TIME "INDENTBYTAB" IS INVOKED,THE MARGIN*)
  304.                            (* WILL BE INDENTED THIS MUCH.             *)
  305.       INDENT2       =   1; (* WHEN THE COLUMN POSITION IS BETWEEN     *)
  306.                            (* SLOFAIL1 AND SLOFAIL2, EACH TIME THE    *)
  307.                            (* "INDENTBYTAB" IS INVOKED, THE MARGIN    *)
  308.                            (* WILL BE INDENTED THIS MUCH.             *)
  309.       SPACE         = ' ';
  310. TYPE
  311.        KEYSYMBOL = ( FUNCSYM         , PROCSYM         , ISSYM       ,
  312.                      WHENSYM         , LOOPSYM         , TYPESYM     ,
  313.                      BEGINSYM        , RECORDSYM       , EXCEPTIONSYM,
  314.                      CASESYM         , USESYM          , EXITSYM     ,
  315.                      FORSYM          , WHILESYM        , WITHSYM     ,
  316.                      DOSYM           , IFSYM           , THENSYM     ,
  317.                      ELSESYM         , SPECIALLOOPSYM  , SPECIALISSYM,
  318.                      SEPARATESYM     , SPECIALUSESYM   , SPECIALORSYM,
  319.                      ELSIFSYM        , PACKAGESYM      , GENERICSYM  ,
  320.                      TASKSYM         , DECLARESYM      , SELECTSYM   ,
  321.                      ORSYM           , ACCEPTSYM       , BODYSYM     ,
  322.                      SPEXCEPTIONSYM  , PRIVATESYM      , NEWSYM      ,
  323.                      ABORTSYM        , ABSSYM          , ACCESSSYM   ,
  324.                      ALLSYM          , ANDSYM          , ARRAYSYM    ,
  325.                      ATSYM           , CONSTANTSYM     , DELAYSYM    ,
  326.                      DELTASYM        , DIGITSSYM       , ENTRYSYM    ,
  327.                      GOTOSYM         , INSYM           , SPECIALPKSYM,
  328.                      LIMITEDSYM      , MODSYM          , NOTSYM      ,
  329.                      NULLSYM         , OFSYM           , OTHERSSYM   ,
  330.                      OUTSYM          , PRAGMASYM       , RAISESYM    ,
  331.                      RANGESYM        , REMSYM          , RENAMESSYM  ,
  332.                      RETURNSYM       , REVERSESYM      , SUBTYPESYM  ,
  333.                      TERMINATESYM    , XORSYM          , SPECIALWTH  ,
  334.                      ENDSYM          , 
  335.                      BECOMES         , ARROWSYM        , OPENCOMMENT ,
  336.                      SEMICOLON       , SPSEMICOLON     , COLON       ,
  337.                      EQUALS          , OPENPAREN       , CLOSEPAREN  ,
  338.                      UNDSCORE        , SPECIALCOLON    , PERIOD      ,
  339.                      ENDOFFILE       ,
  340.                      OTHERSYM        );
  341.           OPTION = ( CRSUPPRESS      ,
  342.                      CRBEFORE        ,
  343.                      BLANKLINEBEFORE ,
  344.                      DINDENT         ,
  345.                      SPACEBEFORE     ,
  346.                      SPACEAFTER      ,
  347.                      GOBBLESYMBOLS   ,
  348.                      INDENTMARGIN    ,
  349.                      INDENTBYTAB     ,
  350.                      CRAFTER         );
  351.        OPTIONSET = SET OF OPTION;
  352.        KEYSYMSET = SET OF KEYSYMBOL;
  353.       TABLEENTRY = RECORD
  354.                      OPTIONSSELECTED  : OPTIONSET;
  355.                      GOBBLETERMINATORS: KEYSYMSET
  356.                    END;
  357.      OPTIONTABLE = ARRAY [ KEYSYMBOL ] OF TABLEENTRY;
  358.              KEY = PACKED ARRAY [ 1..MAXKEYLENGTH ] OF CHAR;
  359.     KEYWORDTABLE = ARRAY [ FUNCSYM..ENDSYM ] OF KEY;
  360.      SPECIALCHAR = PACKED ARRAY [ 1..2 ] OF CHAR;
  361.        DBLCHRSET = SET OF BECOMES..OPENCOMMENT;
  362.     DBLCHARTABLE = ARRAY [ BECOMES..OPENCOMMENT ] OF SPECIALCHAR;
  363.     SGLCHARTABLE = ARRAY [ SEMICOLON..PERIOD ] OF CHAR;
  364.           STRING = ARRAY [ 1..MAXSYMBOLSIZE ] OF CHAR;
  365.           SYMBOL = RECORD
  366.                        NAME        : KEYSYMBOL;
  367.                        VALU        : STRING;
  368.                        LENGTH      : INTEGER;
  369.                        SPACESBEFORE: INTEGER;
  370.                        CRSBEFORE   : INTEGER
  371.                    END;
  372.       SYMBOLINFO = ^SYMBOL;
  373.         CHARNAME = ( LETTER        ,  UNDERSCORE  ,    DIGIT     ,
  374.                      BLANK         ,  QUOTE       ,    ENDOFLINE ,
  375.                      FILEMARK      ,  TAB         ,    OTHERCHAR   );  (*CAW*)
  376.         CHARINFO = RECORD
  377.                       NAME : CHARNAME;
  378.                       VALU : CHAR
  379.                    END;
  380.       STACKENTRY = RECORD
  381.                      INDENTSYMBOL : KEYSYMBOL;
  382.                      PREVMARGIN   : INTEGER;
  383.                      ENDSYMBOL    : STRING;
  384.                      LLENGTH      : INTEGER
  385.                    END;
  386.      SYMBOLSTACK = ARRAY [ 1..MAXSTACKSIZE ] OF STACKENTRY;
  387. VAR
  388.       LOOPSWITCH,        (* USED TO SWITCH BETWEEN A BASIC LOOP AND
  389.                             AND A BASIC_LOOP USED WITH A ITERATION_
  390.                             CLAUSE                                   *)
  391.        USESWITCH,        (* USED TO DETECT A REPRESENTATION_SPECI-
  392.                             FICATION AS OPPOSED TO A USE CLAUSE      *)
  393.         ORSWITCH,        (* USED TO DIFFERIENTATE BETWEEN A LOGICAL
  394.                             OPERATOR AND SELECTIVE-WAIT AND TIMED_
  395.                             ENTRIE_CALLS                             *)
  396.         WITHSEEN,        (* USED TO DETECT THE PRESENCE OF A WITH_
  397.                             CLAUSE-USE_CLAUSE COMBINATION            *)
  398.         ISSWITCH,        (* USED TO DIFFERIENTATE BETWEEN A USESYM
  399.                             AND A SPECIALISSYM                       *)
  400.        SPECIAL_FLAG,
  401.        CRPENDING  : BOOLEAN;
  402.              TOP,       (* NUMBER OF RECORDS ON THE STACK            *)
  403.         STARTPOS,       (* STARTING POSITION OF LAST SYMBOL WRITTEN  *)
  404.      PARENINDENT,       (* USED FOR INDENTION FOR: DISCRIMINANT_PART
  405.                            OF RECORDS; FORMAL_PART OF SUBPROGRAM
  406.                            DECLARATIONS; GENERIC_FORMAL_PARAMETER LIST*)
  407.     PARENCOUNTER,       (* INDICATES THE LEVEL OF NESTING OF PAREN-
  408.                            THESES SETS                               *)
  409.       PREVMARGIN,       (* VALUE OF PREVIOUS MARGIN, STORED ON STACK *)
  410.      CURRLINEPOS,       (* CURRENT LINE POSITION OF THE OUTPUT FILE  *)
  411.       CURRMARGIN  :  INTEGER;
  412.         CURRCHAR,
  413.         NEXTCHAR  : CHARINFO;
  414.  
  415. (***************************************************************************
  416.                              ---  CAW  ---
  417.  
  418.              The following variables, with a brief description, 
  419.           have been added to make this pretty printer more versatile.
  420.  
  421.  
  422.  
  423.    CRSAFTER       -  Is used to print out the same number of carriage returns
  424.                      in the pretty printed file as there is in the source file.
  425.  
  426.    PRIVATE_FLAG   -  A boolean flag used to signal that the "private" keyword
  427.                      is the current symbol and the private section follows.
  428.                      This flag is used to DINDENT the "end" symbol for the
  429.                      package specification.
  430.  
  431.    RECORD_FLAG    -  A boolean flag that is used in conjunction with the 
  432.                      PRIVATE_FLAG.  It signals that a record definition exists
  433.                      in the private section and that an "end record" should
  434.                      be expected before the "end" for the specification.
  435.  
  436.    P_CASE_FLAG    -  A boolean flag used in conjunction with the PRIVATE_FLAG.
  437.                      It signals that a case statement exists within the private
  438.                      section and that an "end case" should be expected before
  439.                      the "end" for the package specification.
  440.  
  441.    SPECIAL_FLAG   -  A boolean flag used to signal whether the symbols 
  442.                      "procedure" or "package" (without the keyword 'body') have
  443.                      been encountered.
  444.  
  445.    NUM_BEGINS     -  An integer flag that keeps count of the number of begin
  446.                      structures have been encountered -- so the corresponding
  447.                      ends can have the same indentation as their structure's
  448.                      initial indentation.
  449.  
  450.    BEGIN_FLAG     -  A boolean flag that is set to true when the keyword 
  451.                      "begin" has been found.
  452.  
  453.    FIRST_BEGIN    -  A boolean flag that is set to true when the first begin,
  454.                      or loop structure, has been encountered.
  455.  
  456.    WHEN_FLAG      -  An integer flag used to keep count of the number of "when"
  457.                      statements that have been parsed.  This is to provide for
  458.                      all of the related "when's" to have identical indentation.
  459.  
  460.    
  461.  
  462.    ----  All of the following variables are arrays of boolean flags.
  463.          They are used to synchronize the ends with the begins in 
  464.          nested CASE, EXCEPTION, and block statements.  By turning the
  465.          flags off and on in an array, the index can be incremented
  466.          as nesting occurs and the end statement will match the associated
  467.          structure by stepping back through the array when an end is
  468.          parsed.
  469.  
  470.  
  471.    SPECIAL_BEGIN  -  Signals that a block statement is embedded in a CASE
  472.                      or EXCEPTION statement.
  473.  
  474.    EXCEPTION_FLAG -  Signals that an exception statement has occurred and
  475.                      an end -- in the same column as the "exception" --
  476.                      should be expected.
  477.  
  478.    CASE_FLAG      -  Signals that a case statement has been parsed and that
  479.                      an end statement -- in the same column as the CASE --
  480.                      should be expected.
  481.  
  482.    SPECIAL_INDEX  -  The global index into the three arrays to keep track of
  483.                      the current level of nesting.
  484.                                                                          *)
  485.    
  486.  
  487.     CRSAFTER,
  488.     NUM_BEGINS                 : INTEGER;
  489.     WHEN_FLAG, SPECIAL_INDEX   : INTEGER;
  490.     BEGIN_FLAG                 : BOOLEAN;
  491.     PRIVATE_FLAG, RECORD_FLAG,
  492.     P_CASE_FLAG                : BOOLEAN;
  493.     FIRST_BEGIN                : BOOLEAN;
  494.     SPECIAL_BEGIN,
  495.     CASE_FLAG,
  496.     EXCEPTION_FLAG             : ARRAY[1..100] OF BOOLEAN;
  497.  
  498. (*************************   CAW   ***********************************)
  499.  
  500.  
  501.  
  502.     ENDIDENTIFIER : STACKENTRY;
  503.          CURRSYM,
  504.          NEXTSYM  : SYMBOLINFO;
  505.         PPOPTION  : OPTIONTABLE;
  506.          KEYWORD  : KEYWORDTABLE;
  507.         DBLCHARS  : DBLCHRSET;
  508.          DBLCHAR  : DBLCHARTABLE;
  509.          SGLCHAR  : SGLCHARTABLE;
  510.            STACK  : SYMBOLSTACK;
  511. (*=********************************************************************)
  512. (**********************************************************************)
  513. (***                                                                ***)
  514. (***   NAME                                                         ***)
  515. (***                 WRITECRS                                       ***)
  516. (***                                                                ***)
  517. (***   DESCRIPTION                                                  ***)
  518. (***             THIS PROCEDURE WRITES TO THE OUTPUT FILE.  IF      ***)
  519. (***         "CRSBEFORES" EQUALS ZERO, THEN NOTHING IS WRITTEN.     ***)
  520. (***         IF "CRSBEFORE" EQUALS N, THEN N-1 BLANK LINES ARE      ***)
  521. (***         INSERTED AND THE CURRENT LINE POSTION SET TO ZERO      ***)
  522. (***         IN ALL CASES WHREE N IF GREATER THAN ZERO.             ***)
  523. (***                                                                ***)
  524. (***                                                                ***)
  525. (***   INPUTS                                                       ***)
  526. (***         NUMBEROFCRS--- NUMBER OF CARRIAGE RETURNS TO BE        ***)
  527. (***                        OUTPUT PRIOR TO OUTPUTING THE           ***)
  528. (***                        CURRENT SYMBOL                          ***)
  529. (***                                                                ***)
  530. (***   OUTPUTS                                                      ***)
  531. (***         CURRLINEPOS--- SET TO ZERO                             ***)
  532. (***                                                                ***)
  533. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  534. (***                   NONE                                         ***)
  535. (***                                                                ***)
  536. (***   REFERENCED BY                                                ***)
  537. (***                   INSERTCR                                     ***)
  538. (***                   INSERTBLANKLINE                              ***)
  539. (***                   PPSYMBOL                                     ***)
  540. (***                                                                ***)
  541. (**********************************************************************)
  542. PROCEDURE WRITECRS( (* USING *)          NUMBEROFCRS : INTEGER;
  543.                     (* UPDATING *)   VAR CURRLINEPOS : INTEGER
  544.                     (* WRITING TO OUTPUT *)                  );
  545. VAR
  546.     I: INTEGER;
  547. BEGIN (* WRITECRS *)
  548.    IF NUMBEROFCRS > 0
  549.       THEN
  550.          BEGIN
  551.             FOR I := 1 TO NUMBEROFCRS DO
  552.                WRITELN;
  553.               CURRLINEPOS  := 0
  554.          END
  555. END; (* WRITECRS *)
  556. (*=********************************************************************)
  557. (**********************************************************************)
  558. (***                                                                ***)
  559. (***   NAME                                                         ***)
  560. (***         GETCHAR                                                ***)
  561. (***                                                                ***)
  562. (***   DESCRIPTION                                                  ***)
  563. (***         THE PURPOSE OF THIS PROCEDURE IS THREEFOLD;            ***)
  564. (***            A- BEFORE FETCHING THE NEST CHARACTER FROM THE      ***)
  565. (***               INPUT-FILE,IT UPDATES THE CURRENT-CHARACTER      ***)
  566. (***               TO THE VALUE OF THE PREVIOUS NEXT-CHARACTER.     ***)
  567. (***            B- EXAMINATION AND CLASSIFICATION OF THE CHARACTER  ***)
  568. (***               NAME OF THE NEXT CHARACTER ON THE INPUT FILE.    ***)
  569. (***            C- READ THE NEXT CHARACTER FROM THE INPUT FILE.     ***)
  570. (***                                                                ***)
  571. (***   INPUTS                                                       ***)
  572. (***            NONE                                                ***)
  573. (***                                                                ***)
  574. (***   OUTPUTS                                                      ***)
  575. (***            CURRCHAR                                            ***)
  576. (***            NEXTCHAR                                            ***)
  577. (***                                                                ***)
  578. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  579. (***            NONE                                                ***)
  580. (***                                                                ***)
  581. (***   REFERENCED BY                                                ***)
  582. (***                STORENEXTCHAR                                   ***)
  583. (***                SKIPSPACES                                      ***)
  584. (***                INITIALIZE                                      ***)
  585. (***                                                                ***)
  586. (**********************************************************************)
  587. PROCEDURE GETCHAR( (* FROM INPUT *)
  588.                    (* UPDATING *)  VAR NEXTCHAR  : CHARINFO;
  589.                    (* RETURNING *) VAR CURRCHAR  : CHARINFO );
  590.   CONST                               (*CAW*)
  591.       TAB_CHAR = '    ';            (*CAW*)
  592.  
  593. BEGIN (* GETCHAR *)
  594.  
  595.    CURRCHAR := NEXTCHAR;
  596.    WITH NEXTCHAR DO
  597.       BEGIN
  598.             IF EOF(INPUT)
  599.             THEN
  600.                NAME  := FILEMARK
  601.             ELSE
  602.                IF EOLN(INPUT)
  603.                THEN
  604.                   NAME  := ENDOFLINE
  605.                ELSE
  606.                   IF INPUT^ IN ['A'..'Z','a'..'z']
  607.                   THEN
  608.                      NAME  := LETTER
  609.                   ELSE
  610.                      IF INPUT^ = '_'
  611.                      THEN
  612.                         NAME  := UNDERSCORE
  613.                      ELSE
  614.                         IF INPUT^ IN ['0'..'9']
  615.                         THEN
  616.                            NAME  := DIGIT
  617.                         ELSE
  618.                            IF INPUT^ = '"'
  619.                            THEN
  620.                               NAME  := QUOTE
  621.                            ELSE
  622.                               IF INPUT^ = SPACE
  623.                               THEN
  624.                                  NAME := BLANK
  625.                               ELSE IF INPUT^ = TAB_CHAR      (*CAW*)
  626.                                  THEN NAME := TAB            (*CAW*)
  627.                                  ELSE
  628.                                     NAME := OTHERCHAR;
  629.             IF NAME IN [ FILEMARK, ENDOFLINE ]
  630.             THEN
  631.                VALU := SPACE
  632.             ELSE
  633.                VALU := INPUT^;
  634.             IF NAME <> FILEMARK
  635.             THEN
  636.                GET(INPUT)
  637.    END (* WITH *)
  638. END; (* GETCHAR *)
  639. (*=********************************************************************)
  640. (**********************************************************************)
  641. (***                                                                ***)
  642. (***   NAME                                                         ***)
  643. (***           STORENEXTCHAR                                        ***)
  644. (***                                                                ***)
  645. (***   DESCRIPTION                                                  ***)
  646. (***          THE ADA PRETTYPRINTER PROCESSES ONE TOKEN AT A TIME.  ***)
  647. (***       THE INPUT-FILE IS CONTINOUSLY READ, ONE CHARACTER AT A   ***)
  648. (***       TIME, UNTIL A COMPLETE TOKEN IS OBTAINED.  THIS PROCED-  ***)
  649. (***       URE PROVIDES THE BUFFER TO STORE THE INPUT CHARACTER     ***)
  650. (***       UNTIL A COMPLETE TOKEN STORED.                           ***)
  651. (***                                                                ***)
  652. (***                                                                ***)
  653. (***   INPUTS                                                       ***)
  654. (***       CURRCHAR.VALUE--THE VALUE OF THE CURRENT CHARACTER.      ***)
  655. (***       LENGTH-- THE NUMBER OF CHARACTERS PRESENTLY STORED       ***)
  656. (***                IN THE INPUT BUFFER.                            ***)
  657. (***                                                                ***)
  658. (***   OUTPUTS                                                      ***)
  659. (***       LENGTH-- THE UPDATED LENGTH OF THE PRESENT INPUT         ***)
  660. (***                CHARACTER STRING.                               ***)
  661. (***       VALU-- ARRAY WHOSE COMPONETS CONTAINS THE CHARACTERS     ***)
  662. (***              OF THE CURRENT TOKEN OF THE INPUT FILE.           ***)
  663. (***                                                                ***)
  664. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  665. (***                  GETCHAR                                       ***)
  666. (***                                                                ***)
  667. (***   REFERENCED BY                                                ***)
  668. (***                  GETCOMMENT                                    ***)
  669. (***                  GETIDENTIFIER                                 ***)
  670. (***                  GETNUMBER                                     ***)
  671. (***                  GETSTRINGLITERAL                              ***)
  672. (***                  GETSPECIALCHAR                                ***)
  673. (***                  GETNEXTSYMBOL                                 ***)
  674. (***                                                                ***)
  675. (**********************************************************************)
  676. PROCEDURE STORENEXTCHAR( (* FROM INPUT *)
  677.                          (* UPDATING *)    VAR LENGTH    : INTEGER;
  678.                                            VAR CURRCHAR,
  679.                                                NEXTCHAR  : CHARINFO;
  680.                          (* PLACING IN *)  VAR VALU      : STRING   );
  681. BEGIN (* STORENEXTCHAR *)
  682.    GETCHAR( (* FROM INPUT *)
  683.             (* UPDATING *)  NEXTCHAR,
  684.             (* RETURNING *) CURRCHAR  );
  685.    IF LENGTH < MAXSYMBOLSIZE
  686.       THEN
  687.          BEGIN
  688.             LENGTH := LENGTH + 1;
  689.             VALU [LENGTH] := CURRCHAR.VALU
  690.          END
  691. END; (* STORENEXTCHAR *)
  692. (*=********************************************************************)
  693. (**********************************************************************)
  694. (***                                                                ***)
  695. (***   NAME                                                         ***)
  696. (***              SKIPSPACES                                        ***)
  697. (***                                                                ***)
  698. (***   DESCRIPTION                                                  ***)
  699. (***          THE PURPOSE OF THIS PROCEDURE IS TO CONTINOUSLY READ  ***)
  700. (***     THE INPUT FILE UNTIL A CHARACTER IS READ WHICH IS NOT      ***)
  701. (***     A BLANK.  THE NUMBER OF BLANKS READ IS RECORDED AS WELL    ***)
  702. (***     AS THE NUMBER OF CARRIAGE RETURNS ENCOUNTERED.             ***)
  703. (***                                                                ***)
  704. (***   INPUTS                                                       ***)
  705. (***       CURRCHAR.NAME-- FROM THE INPUT FILE                      ***)
  706. (***                                                                ***)
  707. (***   OUTPUTS                                                      ***)
  708. (***       SPACESBEFORE-- NUMBER OF SPACES ENCOUNTERED PRIOR TO     ***)
  709. (***                      NEXT SYMBOL ON THE INPUT FILE.            ***)
  710. (***       CRSBEFORE----- NUMBER OF CARRIAGE RETURNS ENCOUNTERED    ***)
  711. (***                      INPUT FILE PRIOR TO THE NEXT SYMBOL.      ***)
  712. (***                                                                ***)
  713. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  714. (***                    GETCHAR                                     ***)
  715. (***                                                                ***)
  716. (***   REFERENCED BY                                                ***)
  717. (***                    GETSYMBOL                                   ***)
  718. (***                                                                ***)
  719. (**********************************************************************)
  720. PROCEDURE SKIPSPACES(
  721.                       (* UPDATING *)  VAR CURRCHAR,
  722.                                           NEXTCHAR     : CHARINFO;
  723.                       (* RETURNING *) VAR SPACESBEFORE,
  724.                                           CRSBEFORE    : INTEGER  );
  725. BEGIN (* SKIPSPACES *)
  726.    SPACESBEFORE := 0;
  727.    CRSBEFORE    := 0;
  728.    WHILE NEXTCHAR.NAME IN [ BLANK, ENDOFLINE, TAB ] DO   (*CAW*)
  729.       BEGIN
  730.           GETCHAR( (* FROM INPUT *)
  731.                    (* UPDATING *)  NEXTCHAR,
  732.                    (* RETURNING *) CURRCHAR  );
  733.           CASE CURRCHAR.NAME OF
  734.              ENDOFLINE:  BEGIN
  735.                             SPACESBEFORE := 0;
  736.                             CRSBEFORE    := CRSBEFORE + 1;
  737.                           END;
  738.              BLANK    :   SPACESBEFORE := SPACESBEFORE + 1;
  739.              TAB      :   SPACESBEFORE := SPACESBEFORE + 6;  (*CAW*)
  740.          END; (*CASE*)
  741.    END (* WHILE *)
  742. END; (* SKIPSPACES *)
  743. (*=********************************************************************)
  744. (**********************************************************************)
  745. (***                                                                ***)
  746. (***   NAME                                                         ***)
  747. (***                 GETCOMMENT                                     ***)
  748. (***                                                                ***)
  749. (***   DESCRIPTION                                                  ***)
  750. (***          THE PURPOSE OF THIS PROCEDURE IS TO CONTINOUSLY       ***)
  751. (***      READ AND STORE ALL CHARACTERS FROM THE INPUT FILE         ***)
  752. (***      UNTIL THE OF END OF A LINE (WHICH REPRESENTS THE END      ***)
  753. (***      OF THE COMMENT) IS DETECTED.                              ***)
  754. (***                                                                ***)
  755. (***   INPUTS                                                       ***)
  756. (***       NEXTCHAR.NAME-- THE NAME OF THE NEXT CHARACTER FROM      ***)
  757. (***                       THE INPUT FILE (USED TO TERMINATE THE    ***)
  758. (***                       READ OPERATIONS).                        ***)
  759. (***                                                                ***)
  760. (***   OUTPUTS                                                      ***)
  761. (***       NONE                                                     ***)
  762. (***                                                                ***)
  763. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  764. (***                     STORENEXTCHAR                              ***)
  765. (***                                                                ***)
  766. (***   REFERENCED BY                                                ***)
  767. (***                     GETNEXTSYMBOL                              ***)
  768. (***                                                                ***)
  769. (**********************************************************************)
  770. PROCEDURE GETCOMMENT( (* FROM INPUT *)
  771.                       (* UPDATING *) VAR CURRCHAR,
  772.                                          NEXTCHAR  : CHARINFO;
  773.                                      VAR NAME      : KEYSYMBOL;
  774.                                      VAR VALU      : STRING;
  775.                                      VAR LENGTH    : INTEGER   );
  776. BEGIN (* GETCOMMENT *)
  777.    NAME := OPENCOMMENT;
  778.    WHILE NOT (   (NEXTCHAR.NAME = ENDOFLINE)
  779.               OR (NEXTCHAR.NAME = FILEMARK)) DO
  780.       STORENEXTCHAR( (* FROM INPUT *)
  781.                      (* UPDATING   *)   LENGTH,
  782.                                       CURRCHAR,
  783.                                       NEXTCHAR,
  784.                      (* IN         *)     VALU);
  785. END; (* GETCOMMENT *)
  786. (*=********************************************************************)
  787. (**********************************************************************)
  788. (***                                                                ***)
  789. (***   NAME                                                         ***)
  790. (***             IDTYPE                                             ***)
  791. (***                                                                ***)
  792. (***   DESCRIPTION                                                  ***)
  793. (***             AFTER A INPUT TOKEN IS DETERMINED TO BE AN         ***)
  794. (***      IDENTIFIER, IT IS NECESSARY TO DETERMINE IF               ***)
  795. (***      THE IDENTIFIER IS ONE OF THE KEYWORDS IN THE KEYWORD-     ***)
  796. (***      TABLE WHICH REQUIRES SPECIAL PROCESSING.  IF IT IS        ***)
  797. (***      NOT A KEYWORD, THEN IT IS NAMED AN "OTHERSYM" FOR PRO-    ***)
  798. (***      PROCESSING.  THIS IS ACCOMPLISHED BY:                     ***)
  799. (***           A- WRITING THE IDENTIFIER INTO KEYVALU WHICH IS      ***)
  800. (***              AN OBJECT OF THE PACKED ARRAY "KEY".              ***)
  801. (***           B- FILLING THE REST OF THE PACKED ARRAY WITH         ***)
  802. (***              BLANKS UP TO MAXKEYLENGTH.                        ***)
  803. (***           C- LOOPING THROUGH THE KEYWORDTABLE AND COMPARING    ***)
  804. (***              "KEYVALU" TO KEYWORD.                             ***)
  805. (***           D- IF A COMPARISON IS TRUE THEN THE IDENTIFIER IS    ***)
  806. (***              ASSIGNED THE VALUE OF THE KEYSYMBOL.              ***)
  807. (***                                                                ***)
  808. (***   INPUTS                                                       ***)
  809. (***            LENGTH-- THE NUMBER OF CHARACTER IN THE STRING      ***)
  810. (***                     OF THE NAME OF THE IDENTIFIER.             ***)
  811. (***            VALU---- THE ARRAY WHOSE COMPONETS ARE THE CHAR-    ***)
  812. (***                     ACTERS OF THE NAME OF THE IDENTIFIER.      ***)
  813. (***                                                                ***)
  814. (***   OUTPUTS                                                      ***)
  815. (***            IDTYPE-- EQUAL "OTHERSYM" IF VALU IS NOT IN THE     ***)
  816. (***                     KEYWORDTABLE.  IF VALU IS FOUND IN THE     ***)
  817. (***                     KEYWORDTABLE THE IDTYPE IS SET TO THIS     ***)
  818. (***                     SYMBOL.                                    ***)
  819. (***                                                                ***)
  820. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  821. (***                   NONE                                         ***)
  822. (***                                                                ***)
  823. (***   REFERENCED BY                                                ***)
  824. (***                   GETIDENTIFIER                                ***)
  825. (***                                                                ***)
  826. (**********************************************************************)
  827. FUNCTION IDTYPE( (* OF *)        VALU   : STRING;
  828.                  (* USING *)     LENGTH : INTEGER )
  829.                  (* RETURNING *)                   : KEYSYMBOL;
  830. VAR
  831.           I : INTEGER;
  832.     KEYVALU : KEY;
  833.         HIT : BOOLEAN;
  834.     THISKEY : KEYSYMBOL;
  835. BEGIN (* IDTYPE *)
  836.    IDTYPE := OTHERSYM;
  837.    IF LENGTH <= MAXKEYLENGTH
  838.       THEN
  839.          BEGIN
  840.             FOR I := 1 TO LENGTH DO
  841.               IF ORD(VALU[I]) > ORD('Z')
  842.                 THEN 
  843.                   KEYVALU[I] := CHR(ORD(VALU[I])-32)
  844.                 ELSE
  845.                   KEYVALU [I] := VALU [I];
  846.             FOR I := LENGTH + 1 TO MAXKEYLENGTH DO
  847.                KEYVALU [I] := SPACE;
  848.             THISKEY := FUNCSYM;
  849.             HIT     := FALSE;
  850.             WHILE NOT (HIT OR (THISKEY = SUCC(ENDSYM))) DO
  851.                IF KEYVALU = KEYWORD [THISKEY]
  852.                   THEN
  853.                      HIT := TRUE
  854.                   ELSE
  855.                      THISKEY := SUCC(THISKEY);
  856.             IF HIT
  857.                THEN
  858.                   IDTYPE := THISKEY
  859.          END;
  860. END; (* IDTYPE *)
  861.  
  862. (**********************************************************************)
  863. (* -- RLC -- CAPITALIZATION AND LOWER-CASE CONVERSION ROUTINES        *)
  864. (* ROUTINES                                                           *)
  865. (*      TOUPPER  -- CONVERTS INPUT CHAR TO UPPER CASE IF LOWER CASE   *)
  866. (*      TOLOWER  -- CONVERTS INPUT CHAR TO LOWER CASE IF UPPER CASE   *)
  867. (**********************************************************************)
  868.  
  869. FUNCTION TOUPPER (INCH : CHAR) : CHAR;
  870. BEGIN
  871.    IF INCH IN ['a'..'z'] THEN
  872.       TOUPPER := CHR(ORD(INCH) - ORD(' '))
  873.    ELSE
  874.       TOUPPER := INCH;
  875. END;  (* TOUPPER *)
  876.  
  877. FUNCTION TOLOWER (INCH : CHAR) : CHAR;
  878. BEGIN
  879.    IF INCH IN ['A'..'Z'] THEN
  880.       TOLOWER := CHR(ORD(INCH) + ORD(' '))
  881.    ELSE
  882.       TOLOWER := INCH;
  883. END;  (* TOLOWER *)
  884.  
  885. (*=********************************************************************)
  886. (**********************************************************************)
  887. (***                                                                ***)
  888. (***   NAME                                                         ***)
  889. (***             GETIDENTIFIER                                      ***)
  890. (***                                                                ***)
  891. (***   DESCRIPTION                                                  ***)
  892. (***             WHEN THE FIRST CHARACTER OF A TOKEN FROM           ***)
  893. (***      THE INPUT FILE IS A LETER (A..Z) , THEN THIS PRO-         ***)
  894. (***      CEDURE IS CALLED AND WILL CONTINUE TO READ AND STORE      ***)
  895. (***      CHARACTERS FROM THE INPUT FILE AS LONG AS THEY ARE        ***)
  896. (***      LETTERS (A..Z), NUMBERS (0..9) OR AN UNDERSCORE (_).      ***)
  897. (***      AFTER THE COMPLETE TOKEN IS READ AND STORED, A CALL       ***)
  898. (***      TO FUNCTION IDTYPE IS MADE TO IDENTIFY THE SPECIFIC       ***)
  899. (***      SYMBOL.                                                   ***)
  900. (***                                                                ***)
  901. (***   MODIFICATION BY RLC                                          ***)
  902. (***      OPTIONAL CAPITALIZATION IS PERFORMED OF THE IDENTIFIER    ***)
  903. (***      BASED ON CAPITALIZEID (CAP IDENTIFIERS) AND CAPITALIZEKEY ***)
  904. (***      (CAP KEYWORDS) GLOBAL VARIABLES                           ***)
  905. (***                                                                ***)
  906. (***   INPUTS                                                       ***)
  907. (***            NEXTCHAR.NAME-- THE NAME OF THE NEXT CHARACTER      ***)
  908. (***                            FROM THE INPUT FILE.                ***)
  909. (***                                                                ***)
  910. (***   OUTPUTS                                                      ***)
  911. (***            NONE                                                ***)
  912. (***                                                                ***)
  913. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  914. (***                    STORENEXTCHAR                               ***)
  915. (***                    IDTYPE                                      ***)
  916. (***                                                                ***)
  917. (***   REFERENCED BY                                                ***)
  918. (***                    GETNEXTSYMBOL                               ***)
  919. (***                                                                ***)
  920. (**********************************************************************)
  921. PROCEDURE GETIDENTIFIER( (* FROM INPUT *)
  922.                          (* UPDATING *)  VAR CURRCHAR,
  923.                                              NEXTCHAR  : CHARINFO;
  924.                          (* RETURNING *) VAR NAME      : KEYSYMBOL;
  925.                                          VAR VALU      : STRING;
  926.                                          VAR LENGTH    : INTEGER   );
  927. VAR
  928.    I : INTEGER;
  929.  
  930. BEGIN (* GETIDENTIFIER *)
  931.    WHILE NEXTCHAR.NAME IN [ LETTER .. DIGIT ] DO
  932.       STORENEXTCHAR( (* FROM INPUT *)
  933.                      (* UPDATING *) LENGTH,
  934.                                     CURRCHAR,
  935.                                     NEXTCHAR,
  936.                      (* IN *)       VALU      );
  937.    NAME := IDTYPE( (* OF *)    VALU,
  938.                    (* USING *) LENGTH );
  939.  
  940.    (* -- RLC -- CAPITALIZATION ROUTINE FOR KEYWORDS/IDENTIFIERS *)
  941.    FOR I := 1 TO LENGTH DO BEGIN
  942.       IF (NAME = OTHERSYM) AND CAPITALIZEID THEN
  943.          VALU[I] := TOUPPER(VALU[I]);
  944.       IF (NAME = OTHERSYM) AND (NOT CAPITALIZEID) THEN
  945.          VALU[I] := TOLOWER(VALU[I]);
  946.       IF (NOT (NAME = OTHERSYM)) AND CAPITALIZEKEY THEN
  947.          VALU[I] := TOUPPER(VALU[I]);
  948.       IF (NOT (NAME = OTHERSYM)) AND (NOT CAPITALIZEKEY) THEN
  949.          VALU[I] := TOLOWER(VALU[I]);
  950.    END;  (* -- RLC -- *)
  951.  
  952. END; (* GETIDENTIFIER *)
  953. (*=********************************************************************)
  954. (**********************************************************************)
  955. (***                                                                ***)
  956. (***   NAME                                                         ***)
  957. (***               GETNUMBER                                        ***)
  958. (***                                                                ***)
  959. (***   DESCRIPTION                                                  ***)
  960. (***           WHEN THE FIRST CHARACTER OF A TOKEN FROM THE         ***)
  961. (***       FILE IS A DIGIT (0..9), THEN THIS PROCEDURE IS           ***)
  962. (***       CALLED TO CONTINUOUSLY READ AND STORE CHARACTERS         ***)
  963. (***       FROM THE INPUT FILE AS LONG AS THEY ARE DIGITS OR        ***)
  964. (***       AN UNDERSCORE (_) OR HASH (#) OR DOT (.) OR LETTER.      ***)
  965. (***       AFTER THE COMPLETE TOKEN                                 ***)
  966. (***       IS READ AND STORED, THE NUMBER IS ASSIGNED THE NAME      ***)
  967. (***       "OTHERSYM" FOR FURTHER PROCESSISNG.                      ***)
  968. (***                                                                ***)
  969. (***   INPUTS                                                       ***)
  970. (***       NEXTCHAR--FROM THE INPUT FILE                            ***)
  971. (***                                                                ***)
  972. (***   OUTPUTS                                                      ***)
  973. (***       NAME---- CURRENT TOKEN("CURRSYM") AND IS EQUAL           ***)
  974. (***                TO "OTHERSYM"                                   ***)
  975. (***       LENGTH-- NUMBER OF CHARACTERS IN THE NUMBER              ***)
  976. (***       VALU---- PACKED ARRAY CONTAINING THE CHARACTERS          ***)
  977. (***                (DIGITS, UNDERSCORES) OF THE NUMBER             ***)
  978. (***                                                                ***)
  979. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  980. (***                   STORENEXTCHAR                                ***)
  981. (***                                                                ***)
  982. (***   REFERENCED BY                                                ***)
  983. (***                   GETNEXTSYMBOL                                ***)
  984. (***                                                                ***)
  985. (**********************************************************************)
  986. PROCEDURE GETNUMBER( (* FROM INPUT *)
  987.                      (* UPDATING *)  VAR CURRCHAR,
  988.                                          NEXTCHAR  : CHARINFO;
  989.                      (* RETURNING *) VAR NAME      : KEYSYMBOL;
  990.                                      VAR VALU      : STRING;
  991.                                      VAR LENGTH    : INTEGER   );
  992. BEGIN (* GETNUMBER *)
  993.    WHILE (NEXTCHAR.NAME IN [ DIGIT, UNDERSCORE, LETTER ]) OR
  994.          (NEXTCHAR.VALU = '.') OR (NEXTCHAR.VALU = '#') DO
  995.       STORENEXTCHAR( (* FROM INPUT *)
  996.                      (* UPDATING *) LENGTH,
  997.                                     CURRCHAR,
  998.                                     NEXTCHAR,
  999.                      (* IN *)       VALU      );
  1000.    NAME := OTHERSYM
  1001. END; (* GETNUMBER *)
  1002. (*=********************************************************************)
  1003. (**********************************************************************)
  1004. (***                                                                ***)
  1005. (***   NAME                                                         ***)
  1006. (***           GETSTRINGLITERAL                                     ***)
  1007. (***                                                                ***)
  1008. (***   DESCRIPTION                                                  ***)
  1009. (***           WHEN THE FIRST CHARACTER OF A TOKEN FROM THE         ***)
  1010. (***      INPUT FILE IS A QUOTE ('), THEN THIS PROCEDURE IS         ***)
  1011. (***      CALLED BY THE PROCEDURE GETNEXTSYMBOL TO CONTINUOUSLY     ***)
  1012. (***      READ AND STORE CHARACTERS FROM THE INPUT FILE UNTIL       ***)
  1013. (***      THE ENTIRE CHARACTER LITERAL IS READ AND STORED. BE-      ***)
  1014. (***      "OTHERSYM" FOR SUBSEQUENT PROCESSING.                     ***)
  1015. (***                                                                ***)
  1016. (***   INPUTS                                                       ***)
  1017. (***      NEXTCHAR.NAME -- NAME OF THE NEXT CHARACTER FROM THE      ***)
  1018. (***                       INPUT FILE.                              ***)
  1019. (***                                                                ***)
  1020. (***   OUTPUTS                                                      ***)
  1021. (***      NAME --- NAME OF CURRENT SYMBOL AND EQUALS "OTHERSYM".    ***)
  1022. (***      LENGTH - NUMBER OF CHARACTERS IN THE CHARACTER LITERAL    ***)
  1023. (***               INCLUDING THE QUOTE CHARACTERS.                  ***)
  1024. (***      VALU --- PACKED ARRAY CONTAINING THE CHARACTER OF THE     ***)
  1025. (***               CHARACTERAL LITERAL.                             ***)
  1026. (***                                                                ***)
  1027. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  1028. (***                  STORENEXTCHAR                                 ***)
  1029. (***                                                                ***)
  1030. (***   REFERENCED BY                                                ***)
  1031. (***                  GETNEXTSYMBOL                                 ***)
  1032. (***                                                                ***)
  1033. (**********************************************************************)
  1034. PROCEDURE GETSTRINGLITERAL( (* FROM INPUT *)
  1035.                           (* UPDATING *)  VAR CURRCHAR,
  1036.                                               NEXTCHAR  : CHARINFO;
  1037.                           (* RETURNING *) VAR NAME      : KEYSYMBOL;
  1038.                                           VAR VALU      : STRING;
  1039.                                           VAR LENGTH    : INTEGER   );
  1040. BEGIN (* GETSTRINGLITERAL *)
  1041.    WHILE NEXTCHAR.NAME = QUOTE DO
  1042.       BEGIN
  1043.          STORENEXTCHAR( (* FROM INPUT *)
  1044.                         (* UPDATING *) LENGTH,
  1045.                                        CURRCHAR,
  1046.                                        NEXTCHAR,
  1047.                         (* IN *)       VALU      );
  1048.          WHILE NOT(NEXTCHAR.NAME IN [ QUOTE, ENDOFLINE, FILEMARK ]) DO
  1049.             STORENEXTCHAR( (* FROM INPUT *)
  1050.                            (* UPDATING *) LENGTH,
  1051.                                           CURRCHAR,
  1052.                                           NEXTCHAR,
  1053.                            (* IN *)       VALU      );
  1054.          IF NEXTCHAR.NAME = QUOTE
  1055.             THEN
  1056.                STORENEXTCHAR( (* FROM INPUT *)
  1057.                               (* UPDATING *) LENGTH,
  1058.                                              CURRCHAR,
  1059.                                              NEXTCHAR,
  1060.                               (* IN *)       VALU      )
  1061.       END;
  1062.    NAME := OTHERSYM
  1063. END; (* GETSTRINGLITERAL *)
  1064. (*=********************************************************************)
  1065. (**********************************************************************)
  1066. (***                                                                ***)
  1067. (***   NAME                                                         ***)
  1068. (***                 CHARTYPE                                       ***)
  1069. (***                                                                ***)
  1070. (***   DESCRIPTION                                                  ***)
  1071. (***           THIS FUNCTION WILL LOOP THROUGH A SET OF             ***)
  1072. (***       SPECIAL CHARACTERS TO SEE IF THE CURRENT CHAR-           ***)
  1073. (***       ACTER(FIRST CHARACTER OF THE NEXT TOKEN ON THE           ***)
  1074. (***       INPUT FILE) AND POSSIBLY THE NEXT CHARACTER (            ***)
  1075. (***       NEXTCHAR) BELONG TO THE SET OF (':=', '=>',              ***)
  1076. (***       '--', ';', ':', '_', '(', ')', '=').  IF SO,             ***)
  1077. (***       THE NAME OF THE SYMBOL IS RETURNED.  IF NOT              ***)
  1078. (***       "OTHERSYM" IS RETURNED.                                  ***)
  1079. (***                                                                ***)
  1080. (***   INPUTS                                                       ***)
  1081. (***       CURRCHAR -- FROM THE INPUT FILE                          ***)
  1082. (***       NEXTCHAR -- FROM THE INPUT FILE                          ***)
  1083. (***                                                                ***)
  1084. (***   OUTPUTS                                                      ***)
  1085. (***       CHARTYPE -- NAME OF THE SYMBOL IF FOUND,                 ***)
  1086. (***                   OTHERWISE EQUALS "OTHERSYM".                 ***)
  1087. (***                                                                ***)
  1088. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  1089. (***                    NONE                                        ***)
  1090. (***                                                                ***)
  1091. (***   REFERENCED BY                                                ***)
  1092. (***                    GETSPECIALCHAR                              ***)
  1093. (***                                                                ***)
  1094. (**********************************************************************)
  1095. FUNCTION CHARTYPE( (* OF *)        CURRCHAR,
  1096.                                    NEXTCHAR : CHARINFO )
  1097.                    (* RETURNING *)                      : KEYSYMBOL;
  1098. VAR
  1099.     NEXTTWOCHARS: SPECIALCHAR;
  1100.     HIT: BOOLEAN;
  1101.     THISCHAR: KEYSYMBOL;
  1102. BEGIN (* CHARTYPE *)
  1103.    NEXTTWOCHARS[1] := CURRCHAR.VALU;
  1104.    NEXTTWOCHARS[2] := NEXTCHAR.VALU;
  1105.    THISCHAR := BECOMES;
  1106.    HIT      := FALSE;
  1107.    WHILE NOT(HIT OR (THISCHAR = SEMICOLON)) DO
  1108.       IF NEXTTWOCHARS = DBLCHAR [THISCHAR]
  1109.          THEN
  1110.             HIT := TRUE
  1111.          ELSE
  1112.             THISCHAR := SUCC(THISCHAR);
  1113.    IF NOT HIT
  1114.       THEN
  1115.          BEGIN
  1116.             THISCHAR := SEMICOLON;
  1117.             WHILE NOT(HIT OR (PRED(THISCHAR) = PERIOD)) DO
  1118.                IF CURRCHAR.VALU = SGLCHAR [THISCHAR]
  1119.                   THEN
  1120.                      HIT := TRUE
  1121.                   ELSE
  1122.                      THISCHAR := SUCC(THISCHAR)
  1123.          END;
  1124.    IF HIT
  1125.       THEN
  1126.          CHARTYPE := THISCHAR
  1127.       ELSE
  1128.          CHARTYPE := OTHERSYM
  1129. END; (* CHARTYPE *)
  1130. (*=********************************************************************)
  1131. (**********************************************************************)
  1132. (***                                                                ***)
  1133. (***   NAME                                                         ***)
  1134. (***                   GETSPECIALCHAR                               ***)
  1135. (***                                                                ***)
  1136. (***   DESCRIPTION                                                  ***)
  1137. (***          IF THE NAME OF THE FIRST CHARACTER OF THE NEXT        ***)
  1138. (***     TOKEN FROM THE INPUT FILE IS NOT IN ( FILEMARK, END-       ***)
  1139. (***     OFLINE, LETTER, UNDERSCORE, DIGIT, QUOTE, SPACE, BLANK)    ***)
  1140. (***     THEN IT IS INITIALLY LABLED AS A "OTHERCHAR".  THIS        ***)
  1141. (***     PROCEDURE WILL CALL THE FUNCTION CHARTYPE TO ATTEMPT       ***)
  1142. (***     TO FURTHER IDENTIFY IT FOR SPECIALIZED PROCESSING.         ***)
  1143. (***                                                                ***)
  1144. (***   INPUTS                                                       ***)
  1145. (***        CURRCHAR -- FROM THE INPUT FILE                         ***)
  1146. (***        NEXTCHAR -- FROM THE INPUT FILE                         ***)
  1147. (***                                                                ***)
  1148. (***   OUTPUTS                                                      ***)
  1149. (***        NAME --- NAME OF THE CURRENT SYMBOL                     ***)
  1150. (***        LENGTH - NUMBER OF CHARACTERS OF THE SYMBOL             ***)
  1151. (***        VALU --- PACKED ARRAY CONTAINING THE CHARACTERS         ***)
  1152. (***                 OF THE SYMBOL.                                 ***)
  1153. (***                                                                ***)
  1154. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  1155. (***                      STORENEXTCHAR                             ***)
  1156. (***                                                                ***)
  1157. (***   REFERENCED BY                                                ***)
  1158. (***                      GETNEXTSYMBOL                             ***)
  1159. (***                                                                ***)
  1160. (**********************************************************************)
  1161. PROCEDURE GETSPECIALCHAR( (* FROM INPUT *)
  1162.                           (* UPDATING *)  VAR CURRCHAR,
  1163.                                               NEXTCHAR  : CHARINFO;
  1164.                           (* RETURNING *) VAR NAME      : KEYSYMBOL;
  1165.                                           VAR VALU      : STRING;
  1166.                                           VAR LENGTH    : INTEGER   );
  1167. BEGIN (* GETSPECIALCHAR *)
  1168.    STORENEXTCHAR( (* FROM INPUT *)
  1169.                   (* UPDATING *) LENGTH,
  1170.                                  CURRCHAR,
  1171.                                  NEXTCHAR,
  1172.                   (* IN *)       VALU      );
  1173.    NAME := CHARTYPE( (* OF *) CURRCHAR,
  1174.                               NEXTCHAR );
  1175.    IF NAME IN DBLCHARS
  1176.       THEN
  1177.          STORENEXTCHAR( (* FROM INPUT *)
  1178.                         (* UPDATING *) LENGTH,
  1179.                                        CURRCHAR,
  1180.                                        NEXTCHAR,
  1181.                         (* IN *)       VALU      )
  1182. END; (* GETSPECIALCHAR *)
  1183. (*=********************************************************************)
  1184. (**********************************************************************)
  1185. (***                                                                ***)
  1186. (***   NAME                                                         ***)
  1187. (***             CHECKSYMBOL                                        ***)
  1188. (***                                                                ***)
  1189. (***   DESCRIPTION                                                  ***)
  1190. (***                                                                ***)
  1191. (***      IN MANY APPLICATIONS THE INDENTATION OF KEYWORDS VARIES   ***)
  1192. (***    AS A FUNCTION OF IT APPLICATION.  SUCH IS THE CASE FOR THE  ***)
  1193. (***    ADA PRETTYPRINTER.  THE PURPOSE OF THIS PROCEDURE IS TO     ***)
  1194. (***    DETERMINE THE APPLICATION IN ORDER TO PROPERLY PERFORM THE  ***)
  1195. (***    FORMATTING OF THE OUTPUT.  THIS PROCEDURE WILL:             ***)
  1196. (***                                                                ***)
  1197. (***       A-  DIFFERIENTIATE BETWEEN A "BASIC_LOOP" ACTING ALONE   ***)
  1198. (***           OR USED IN CONJUNCTION WITH A "ITERATION_CLAUSE".    ***)
  1199. (***           THIS IS ACCOMPLISHED BY SETTING A FLAG, "LOOPSWITCH",***)
  1200. (***           WHENEVER A "FOR" OR A "WHILE" KEYWORD IS ENCOUNTERED ***)
  1201. (***           AND RESETTING IT WHEN A ";" IS PROCESSED(INDICATING  ***)
  1202. (***           THE END OF THE RANGE OF THE "LOOPSWITCH").  WHEN THE ***)
  1203. (***           "BASIC_LOOP" IS USED ALONE, THE KEYWORD "LOOP" IS    ***)
  1204. (***           FORCED ON A LINE BY ITSELF AND THE "SEQUENCE_OF_     ***)
  1205. (***           STATEMENTS" IS INDENTED.                             ***)
  1206. (***                                                                ***)
  1207. (***       B-  DETECT THE USE OF "SELECTIVE_WAIT" AND "TIMED_ENTRY_ ***)
  1208. (***           CALL" STATEMENTS.  THIS IS REQUIRED TO PROPERLY PRO- ***)
  1209. (***           CESS THE KEYOWRD "OR" TO DIFFERIENTIATE ITS USEAGE   ***)
  1210. (***           WITH THESE STATEMENTS AS OPPOSED TO A "LOGICAL_OPER- ***)
  1211. (***           ATOR".  WHEN THE KEYWORD "SELECT" IS PROCESSED.  THE ***)
  1212. (***           SWITCH IS RESET WHEN THE "END SELECT" IS PROCESSED.  ***)
  1213. (***                                                                ***)
  1214. (***       C-  DETECT THE USE OF "REPRESENTATION_SPECIFICATION".    ***)
  1215. (***           THIS IS NECESSARY BECAUSE OF THE "FOR-LOOP" STATE-   ***)
  1216. (***           MENTS. THE PRETTYPRINTER ASSUMES THAT WHEN A "FOR"   ***)
  1217. (***           IS ENCOUNTERED THAT THE STATEMENT IS A "FOR-LOOP"    ***)
  1218. (***           STATEMENT AND THE MARGIN IS INDENTED.  HOWEVER, IF   ***)
  1219. (***           A "USE" KEYWORD IS DETECTED PRIOR TO A "LOOP" KEY-   ***)
  1220. (***           WORD, THEN IT IS EVIDENT THAT THE STATEMENT BEING    ***)
  1221. (***           PROCESSED IS A "REPRESENTATION_SPECIFICATION" AND    ***)
  1222. (***           THE MARGIN IS DEINDENTED.                            ***)
  1223. (***                                                                ***)
  1224. (***       D-  DETECT THE PRESENCE OF A "WITH_CLAUSE-USE_CLAUSE"    ***)
  1225. (***           COMBINATION.  THIS IS THE ONLY CASE WHEN TWO STATE-  ***)
  1226. (***           MENTS ARE ALLOWED ON THE SAME LINE ACCORDING TO THE  ***)
  1227. (***           RULES.  THIS IS ACCOMPLISHED BY:                     ***)
  1228. (***                                                                ***)
  1229. (***              1-  FIRST, THE SETTING OF THE FLAG, "WITHSEEN",   ***)
  1230. (***                  UPON DETECTION OF THE KEYWORD "WITH".         ***)
  1231. (***              2-  WHEN THE NEXT ";" IS PROCESSED, EXAMINE THE   ***)
  1232. (***                  KEYWORD AND IF IT IS A "USE" KEYWORD THEN     ***)
  1233. (***                  SUPPRESS A CARRIAGE RETURN FOLLOWING THE SEMI-***)
  1234. (***                  COLON.                                        ***)
  1235. (***                                                                ***)
  1236. (***       E-  DETECT THE PRESENCE OF A BODY STUB.  THIS IS NECES-  ***)
  1237. (***           SARY BECAUSE THE PRETTYPRINTER ASSUMES THAT WHEN ANY ***)
  1238. (***           ONE OF THE KEYWORDS "PROCEDURE", "FUNCTION", "TASK"  ***)
  1239. (***           OR "PACKAGE" IS DECTED FOLLOWED BY THE KEYWORD "IS"  ***)
  1240. (***           THAT A FULL COMPILATION UNIT IS BEING PROCESSED      ***)
  1241. (***           WHICH CALLS FOR A CARRIAGE RETURN FOLLOWING THE      ***)
  1242. (***           KEYWORD "IS".  IF THE NEXT SYMBOL IS THE KEYWORD     ***)
  1243. (***           "SEPARATE" THEN THE PRETTYPRINTER CORRECTS ITSELF    ***)
  1244. (***           KNOWS THAT IT IS NOW PROCESSING A "BODY_STUB" AND    ***)
  1245. (***           SUPPRESSES THE CARRIAGE RETURN.                      ***)
  1246. (***                                                                ***)
  1247. (***       F-  DIFFERIENTIATE BETWEEN AN "EXCEPTION_DECLARATION"    ***)
  1248. (***           AND AN "EXCEPTION_HANDLER".  THIS IS ACCOMPLISHED    ***)
  1249. (***           BY EXAMINING THE CURRENT SYMBOL AND THE NEXT SYMBOL  ***)
  1250. (***           TOGETHER.  IF THE CURRENT SYMBOL IS A COLON,":",     ***)
  1251. (***           AND IF THE NEXT SYMBOL IS THE KEYWORD "EXCEPTION",   ***)
  1252. (***           THEN IT IS AN "EXCEPTION_DECLARATION", OTHERWISE     ***)
  1253. (***           IT IS AN "EXCEPTION_HANDLER".                        ***)
  1254. (***                                                                ***)
  1255. (***       G-  DETECT THE PRESENCE OF A BLOCK.. THIS IS ACCOMP-     ***)
  1256. (***           LISHED BY ALSO EXAMINING THE CURRENT SYMBOL AND THE  ***)
  1257. (***           COLLECTIVELY.  IF THEY ARE ":" AND "DECLARE" OR      ***)
  1258. (***           ":" AND "BEGIN" THEN A BLOCK IS BEING PROCESSED.     ***)
  1259. (***                                                                ***)
  1260. (***       H-  DIFFERIENTIATE BETWEEN A "SUBPROGRAM_DECLARATION"    ***)
  1261. (***           AND A "SUBPROGRAM_SPECIFICATION".  THIS IS ACCOMP-   ***)
  1262. (***           LISHED BY:                                           ***)
  1263. (***                                                                ***)
  1264. (***              1-  IF THE KEYWORD "PROCEDURE", "FUNCTION",       ***)
  1265. (***                  "TASK" OR "PACKAGE" IS ENCOUNTERED, ASSUME    ***)
  1266. (***                  IT IS A "SUBPROGRAM_SPECIFICATION" AND SET    ***)
  1267. (***                  THE MARGIN FOR INDENTATION.                   ***)
  1268. (***              2-  IF, HOWEVER, A SEMICOLON,";", IS ENCOUNTERED  ***)
  1269. (***                  PRIOR TO THE KEYWORD "IS", THEN DEINDENT THE  ***)
  1270. (***                  MARGIN.                                       ***)
  1271. (***                                                                ***)
  1272. (***   INPUTS                                                       ***)
  1273. (***           CURRSYM--FROM THE INPUT FILE                         ***)
  1274. (***           NEXTSYM--FROM THE INPUT FILE                         ***)
  1275. (***                                                                ***)
  1276. (***   OUTPUTS                                                      ***)
  1277. (***           CURRSYM                                              ***)
  1278. (***           NEXTSYM                                              ***)
  1279. (***           LOOPSWITCH                                           ***)
  1280. (***           ORSWITCH                                             ***)
  1281. (***           USESWITCH                                            ***)
  1282. (***           ISSWITCH                                             ***)
  1283. (***           WITHSEEN                                             ***)
  1284. (***                                                                ***)
  1285. (***   PROCEDURE REFERENCED BY:                                     ***)
  1286. (***                 GETNEXTSYMBOL                                  ***)
  1287. (***                                                                ***)
  1288. (**********************************************************************)
  1289. PROCEDURE CHECKSYMBOL( VAR PARM : SYMBOLINFO);
  1290. BEGIN (*CHECKSYMBOL*)
  1291.   WITH PARM^ DO
  1292.     CASE NAME OF
  1293.         FORSYM     : BEGIN
  1294.                         LOOPSWITCH := TRUE;
  1295.                         USESWITCH  := TRUE;
  1296.                      END;
  1297.         USESYM     : IF USESWITCH
  1298.                         THEN
  1299.                            BEGIN
  1300.                               USESWITCH     := FALSE;
  1301.                               NEXTSYM^.NAME := SPECIALUSESYM;
  1302.                            END;
  1303.         SELECTSYM  : ORSWITCH := TRUE;
  1304.         ORSYM      : IF ORSWITCH
  1305.                         THEN
  1306.                            CURRSYM^.NAME := SPECIALORSYM;
  1307.         ENDSYM     : ORSWITCH := FALSE;
  1308.         LOOPSYM    : IF LOOPSWITCH
  1309.                         THEN
  1310.                            BEGIN
  1311.                               LOOPSWITCH    := FALSE;
  1312.                               NEXTSYM^.NAME := SPECIALLOOPSYM;
  1313.                            END;
  1314.         WHILESYM   : LOOPSWITCH := TRUE;
  1315.         WITHSYM    : WITHSEEN := TRUE;
  1316.         SEMICOLON   : BEGIN
  1317.                         IF NEXTSYM^.NAME = USESYM
  1318.                             THEN
  1319.                                 CURRSYM^.NAME := SPSEMICOLON;
  1320.                         WITHSEEN   := FALSE;
  1321.                         IF NOT(NEXTSYM^.NAME IN [ FORSYM, WHILESYM ])
  1322.                             THEN
  1323.                                LOOPSWITCH := FALSE;
  1324.                         IF PARENCOUNTER = 0
  1325.                            THEN
  1326.                               ISSWITCH   := FALSE;
  1327.                       END;
  1328.         SEPARATESYM :  IF ISSWITCH
  1329.                           THEN
  1330.                             ISSWITCH := FALSE;
  1331.         PROCSYM,
  1332.         FUNCSYM,
  1333.         TASKSYM,
  1334.         PACKAGESYM  :  BEGIN
  1335.                           FIRST_BEGIN := FALSE;
  1336.                           BEGIN_FLAG := FALSE;
  1337.                           ISSWITCH := TRUE;
  1338.                           ENDIDENTIFIER.ENDSYMBOL := NEXTSYM^.VALU;
  1339.                           ENDIDENTIFIER.LLENGTH   := NEXTSYM^.LENGTH;
  1340.                        END;
  1341.         CASESYM     :  ISSWITCH := TRUE;
  1342.         ACCEPTSYM,
  1343.         BODYSYM     :  BEGIN
  1344.                           ENDIDENTIFIER.ENDSYMBOL := NEXTSYM^.VALU;
  1345.                           ENDIDENTIFIER.LLENGTH   := NEXTSYM^.LENGTH;
  1346.                        END;
  1347.         ISSYM       :  IF ISSWITCH
  1348.                           THEN
  1349.                              BEGIN
  1350.                                 ISSWITCH := FALSE;
  1351.                                 CURRSYM^.NAME := SPECIALISSYM;
  1352.                              END;
  1353.         COLON       : IF NAME IN [ DECLARESYM, BEGINSYM ]
  1354.                         THEN
  1355.                            CURRSYM^.NAME := SPECIALCOLON
  1356.                         ELSE
  1357.                            IF NEXTSYM^.NAME = EXCEPTIONSYM
  1358.                               THEN
  1359.                                  NEXTSYM^.NAME := SPEXCEPTIONSYM;
  1360.    END; (*CASE*)
  1361. END; (*CHECKSYMBOL*)
  1362. (*=********************************************************************)
  1363. (**********************************************************************)
  1364. (***                                                                ***)
  1365. (***   NAME                                                         ***)
  1366. (***                    GETNEXTSYMBOL                               ***)
  1367. (***                                                                ***)
  1368. (***   DESCRIPTION                                                  ***)
  1369. (***                                                                ***)
  1370. (***       THIS PROCEDURE EXAMINES THE NEXT CHARACTER NAME OF THE   ***)
  1371. (***    FIRST CHARACTER OF THE NEXT TOKEN ON THE INPUT FILE TO DET- ***)
  1372. (***    MINE THE TYPE OF THE NEXT TOKEN AND THEN CALLS THE APPRO-   ***)
  1373. (***    PRIATE PROCEDURE TO FETCH THE TOKEN.                        ***)
  1374. (***                                                                ***)
  1375. (***   INPUTS                                                       ***)
  1376. (***          NEXTCHAR------FROM THE INPUT FILE                     ***)
  1377. (***          GOBBLESWITCH--TRUE IF IN THE GOBBLE MODE              ***)
  1378. (***          NAME----------COMPONET OF "NEXTSYM"                   ***)
  1379. (***                                                                ***)
  1380. (***   OUTPUTS                                                      ***)
  1381. (***          CURRCHAR--UPDATED VALUE                               ***)
  1382. (***          NEXTCHAR--UPDATED VALUE                               ***)
  1383. (***          NAME------OF NEXT SYMBOL                              ***)
  1384. (***          LENGTH----NUMBER OF CHARACTERS IN NAME STRING         ***)
  1385. (***          VALU------ARRAY WHOSE COMPONETS CONTAINS THE          ***)
  1386. (***                    CHARACTERS OF THE NAME                      ***)
  1387. (***                                                                ***)
  1388. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  1389. (***                    GETIDENTIFIER                               ***)
  1390. (***                    STORENEXTCHAR                               ***)
  1391. (***                    GETNUMBER                                   ***)
  1392. (***                    GETSTRINGLITERAL                            ***)
  1393. (***                    GETSPECIALCHAR                              ***)
  1394. (***                    GETCOMMENT                                  ***)
  1395. (***                                                                ***)
  1396. (***   REFERENCED BY                                                ***)
  1397. (***                    GETSYMBOL                                   ***)
  1398. (***                                                                ***)
  1399. (**********************************************************************)
  1400. PROCEDURE GETNEXTSYMBOL( (* FROM INPUT *)
  1401.                          (* UPDATING *)  VAR CURRCHAR,
  1402.                                              NEXTCHAR  : CHARINFO;
  1403.                          (* RETURNING *) VAR NAME      : KEYSYMBOL;
  1404.                                          VAR VALU      : STRING;
  1405.                                          VAR LENGTH    : INTEGER   );
  1406. BEGIN (* GETNEXTSYMBOL *)
  1407.    CASE NEXTCHAR.NAME OF
  1408.       LETTER      : GETIDENTIFIER( (* FROM INPUT *)
  1409.                                    (* UPDATING *)  CURRCHAR,
  1410.                                                    NEXTCHAR,
  1411.                                    (* RETURNING *) NAME,
  1412.                                                    VALU,
  1413.                                                    LENGTH    );
  1414.       UNDERSCORE  : BEGIN
  1415.                        STORENEXTCHAR(LENGTH  , CURRCHAR,
  1416.                                      NEXTCHAR, VALU);
  1417.                        GETNEXTSYMBOL ( CURRCHAR,
  1418.                                        NEXTCHAR,
  1419.                                        NAME,
  1420.                                        VALU,
  1421.                                        LENGTH );
  1422.                     END;
  1423.       DIGIT       : GETNUMBER( (* FROM INPUT *)
  1424.                                (* UPDATING *)  CURRCHAR,
  1425.                                                NEXTCHAR,
  1426.                                (* RETURNING *) NAME,
  1427.                                                VALU,
  1428.                                                LENGTH    );
  1429.       QUOTE       : GETSTRINGLITERAL( (* FROM INPUT *)
  1430.                                     (* UPDATING *)  CURRCHAR,
  1431.                                                     NEXTCHAR,
  1432.                                     (* RETURNING *) NAME,
  1433.                                                     VALU,
  1434.                                                     LENGTH    );
  1435.       OTHERCHAR   : BEGIN
  1436.                        GETSPECIALCHAR( (* FROM INPUT *)
  1437.                                        (* UPDATING *)  CURRCHAR,
  1438.                                                        NEXTCHAR,
  1439.                                        (* RETURNING *) NAME,
  1440.                                                        VALU,
  1441.                                                        LENGTH    );
  1442.                        IF NAME=OPENCOMMENT
  1443.                           THEN
  1444.                              GETCOMMENT( (* FROM INPUT *)
  1445.                                          (* UPDATING *) CURRCHAR,
  1446.                                                         NEXTCHAR,
  1447.                                                         NAME,
  1448.                                                         VALU,
  1449.                                                         LENGTH);
  1450.                     END;
  1451.       FILEMARK    : NAME := ENDOFFILE
  1452.    END (* CASE *);
  1453. END; (* GETNEXTSYMBOL *)
  1454. (*=********************************************************************)
  1455. (**********************************************************************)
  1456. (***                                                                ***)
  1457. (***   NAME                                                         ***)
  1458. (***                    GETSYMBOL                                   ***)
  1459. (***                                                                ***)
  1460. (***   DESCRIPTION                                                  ***)
  1461. (***                                                                ***)
  1462. (***         THE PURPOSE OF THIS PROCEDURE IS TO UPDATE THE CURRENT ***)
  1463. (***     SYMBOL TO THE VALUE OF THE PLREVIOUS "NEXTSYM".  THE NEXT  ***)
  1464. (***     SYMBOL FROM THE INPUT FILE IS FETCHED AND THE VARIABLE     ***)
  1465. (***     "NEXTSYM" IS UPDATED WITH THIS SYMBOL.  THIS PROCEDURE     ***)
  1466. (***     ALSO RESTRICTS THE NUMBER OF SPACES BETWEEN SYMBOL TO ONE  ***)
  1467. (***    AND REMOVES EXTRANEOUS BLANK LINES FROM THE OUTPUT          ***)
  1468. (***                                                                ***)
  1469. (***   INPUTS                                                       ***)
  1470. (***          CURRSYM ----- FROM THE INPUT FILE                     ***)
  1471. (***          NEXTSYM ----- FROM THE INPUT FILE                     ***)
  1472. (***          CURRLINEPOS-- OF THE OUTPUT FILE                      ***)
  1473. (***                                                                ***)
  1474. (***   OUTPUTS                                                      ***)
  1475. (***          CURRCHAR ---- UPDATED VALUE                           ***)
  1476. (***          NEXTCHAR ---- UPDATED VALUE                           ***)
  1477. (***          CURRSYM  ---- UPDATED VALUE                           ***)
  1478. (***          NEXTSYM  ---- UPDATED VALUE                           ***)
  1479. (***          STARTPOS ---- SAVED FOR INDENTATION PURPOSES          ***)
  1480. (***                                                                ***)
  1481. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  1482. (***                    SKIPSPACES                                  ***)
  1483. (***                    CHECKSYMBOL                                 ***)
  1484. (***                    GETNEXTSYMBOL                               ***)
  1485. (***                                                                ***)
  1486. (***   REFERENCED BY                                                ***)
  1487. (***                    INITIALIZE                                  ***)
  1488. (***                    GOBBLE                                      ***)
  1489. (***                    PRINTENDIDENTIFIER                          ***)
  1490. (***                                                                ***)
  1491. (**********************************************************************)
  1492. PROCEDURE GETSYMBOL( (* FROM INPUT *)
  1493.                      (* UPDATING *)  VAR NEXTSYM   : SYMBOLINFO;
  1494.                      (* RETURNING *) VAR CURRSYM   : SYMBOLINFO );
  1495. VAR
  1496.     DUMMY: SYMBOLINFO;
  1497. BEGIN (* GETSYMBOL *)
  1498.    DUMMY   := CURRSYM;
  1499.    CURRSYM := NEXTSYM;
  1500.    NEXTSYM := DUMMY  ;
  1501.    WITH NEXTSYM^ DO
  1502.       BEGIN
  1503.          SKIPSPACES(
  1504.                    (* UPDATING *)  CURRCHAR,
  1505.                                    NEXTCHAR,
  1506.                    (* RETURNING *) SPACESBEFORE,
  1507.                                    CRSBEFORE     );
  1508.  
  1509.          CRSAFTER := CRSBEFORE;    (* CAW *)
  1510.            
  1511.  
  1512.  
  1513.          LENGTH := 0;
  1514.          GETNEXTSYMBOL( (* FROM INPUT *)
  1515.                       (* UPDATING *)  CURRCHAR,
  1516.                                       NEXTCHAR,
  1517.                       (* RETURNING *) NAME,
  1518.                                       VALU,
  1519.                                       LENGTH    );
  1520.           IF NAME IN [ OPENPAREN, CLOSEPAREN ]
  1521.              THEN
  1522.                 IF NAME = OPENPAREN
  1523.                    THEN
  1524.                       BEGIN
  1525.                          PARENCOUNTER := PARENCOUNTER + 1;
  1526.                          IF PARENCOUNTER = 1
  1527.                             THEN
  1528.                                IF CURRSYM^.CRSBEFORE = 0
  1529.                                   THEN
  1530.                                       PARENINDENT := CURRLINEPOS +
  1531.                                               CURRSYM^.LENGTH + 1
  1532.                                   ELSE
  1533.                                       PARENINDENT := CURRMARGIN +
  1534.                                               CURRSYM^.LENGTH +1;
  1535.                       END
  1536.                    ELSE
  1537.                       PARENCOUNTER := PARENCOUNTER - 1;
  1538.          IF PARENCOUNTER >= 1
  1539.             THEN
  1540.                IF NAME IN [SEMICOLON, OPENCOMMENT, OPENPAREN ]
  1541.                   THEN
  1542.                      STARTPOS := CURRLINEPOS
  1543.                   ELSE
  1544.                      NAME := OTHERSYM;
  1545.          IF (SPACESBEFORE > 1) AND
  1546.             (NOT(NAME = OPENCOMMENT))
  1547.              THEN
  1548.                 SPACESBEFORE := 1;
  1549.          IF (CURRLINEPOS+CURRSYM^.LENGTH<= MAXLINESIZE)AND
  1550.             (NOT(CURRSYM^.NAME = OPENCOMMENT))
  1551.             THEN
  1552.                CURRSYM^.CRSBEFORE := 0;
  1553.          IF NAME IN [ SELECTSYM, ORSYM    , SEPARATESYM,
  1554.                       FORSYM   , WHILESYM , LOOPSYM    ,
  1555.                       ENDSYM   , WITHSYM  , USESYM     ]
  1556.              THEN
  1557.                   CHECKSYMBOL(NEXTSYM);
  1558.          IF CURRSYM^.NAME IN [ PACKAGESYM, FUNCSYM, ACCEPTSYM,
  1559.                                PROCSYM   , CASESYM, TASKSYM  ,
  1560.                                BODYSYM   , ISSYM  , COLON    ,
  1561.                                SEMICOLON ]
  1562.              THEN
  1563.                 CHECKSYMBOL(CURRSYM);
  1564.       END (* WITH *)
  1565. END; (* GETSYMBOL *)
  1566. (**********************************************************************)
  1567. (**********************************************************************)
  1568. (***                                                                ***)
  1569. (***   NAME                                                         ***)
  1570. (***                        INITIALIZE                              ***)
  1571. (***                                                                ***)
  1572. (***   DESCRIPTION                                                  ***)
  1573. (***                                                                ***)
  1574. (***        THE PRIMARY FUNCTION OF THIS PROCEDURE IS TO SET THE    ***)
  1575. (***    PROCESSING OPTIONS SELECTED FROM THE SET OF OPTIONS FOR     ***)
  1576. (***    EACH SYMBOL TO PROCESED AS WELL AS THE GOBBLE SYMBOLS IF    ***)
  1577. (***    THE OPTION "GOBBLESYMBOL" IS SELECTED.  ADDITIONALLY THE    ***)
  1578. (***    "NEXTCHAR" IS FETCH FROM THE INPUT FILE TO INITIATE THE     ***)
  1579. (***    THE INPUTTING OF THE INPUT FILE.  A CALL TO GETSYMBOL THEN  ***)
  1580. (***    INITIALIZES THE "NEXTSYM" AS WELL AS UPDATING OF "NEXTCHAR" ***)
  1581. (***    AND "CURRCHAR".  FINALLY OTHER GOBAL VARIABLES AND ARRAYS   ***)
  1582. (***    ARE INITIALIZED.                                            ***)
  1583. (***                                                                ***)
  1584. (***   INPUTS                                                       ***)
  1585. (***            NONE                                                ***)
  1586. (***                                                                ***)
  1587. (***   OUTPUTS                                                      ***)
  1588. (***            CURRCHAR                                            ***)
  1589. (***            NEXTCHAR                                            ***)
  1590. (***            CURRSYM                                             ***)
  1591. (***            NEXTSYM                                             ***)
  1592. (***                                                                ***)
  1593. (***   INITIALIZES                                                  ***)
  1594. (***            TOP                                                 ***)
  1595. (***            CURRLINPOS                                          ***)
  1596. (***            CURRMARGIN                                          ***)
  1597. (***            KEYWORD                                             ***)
  1598. (***            DBLCHARS                                            ***)
  1599. (***            SGLCHAR                                             ***)
  1600. (***            LOOPSWITCH                                          ***)
  1601. (***            USESWITCH                                           ***)
  1602. (***            WITHSEEN                                            ***)
  1603. (***            ORSWITCH                                            ***)
  1604. (***            CRPENDING                                           ***)
  1605. (***            ISSWITCH                                            ***)
  1606. (***            CURRCHAR                                            ***)
  1607. (***            NEXTCHAR                                            ***)
  1608. (***            CURRSYM                                             ***)
  1609. (***            NEXTSYM                                             ***)
  1610. (***            PPOPTION                                            ***)
  1611. (***                                                                ***)
  1612. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  1613. (***                    GETSYMBOL                                   ***)
  1614. (***                                                                ***)
  1615. (***   REFERENCED BY                                                ***)
  1616. (***                    PRETTYPRINT                                 ***)
  1617. (***                                                                ***)
  1618. (**********************************************************************)
  1619. PROCEDURE INITIALIZE;
  1620. BEGIN (* INITIALIZE *)
  1621.    LINELIMIT(OUTPUT,MAXINT);
  1622.    TOP               := 0;
  1623.    NUM_BEGINS        := 0;       (* CAW *)
  1624.    WHEN_FLAG         := 0;       (* CAW *)
  1625.    SPECIAL_INDEX     := 1;       (* CAW *)
  1626.    EXCEPTION_FLAG[1] := FALSE;   (* CAW *)
  1627.    CASE_FLAG[1]      := FALSE;   (* CAW *)
  1628.    FIRST_BEGIN       := FALSE;   (* CAW *)
  1629.    P_CASE_FLAG       := FALSE;   (* CAW *)
  1630.    RECORD_FLAG       := FALSE;   (* CAW *)
  1631.    PRIVATE_FLAG      := FALSE;   (* CAW *)
  1632.    BEGIN_FLAG        := FALSE;   (* CAW *)
  1633.    SPECIAL_BEGIN[1]  := FALSE;   (* CAW *)
  1634.    CURRLINEPOS       := 0;
  1635.    CURRMARGIN        := 0;
  1636.    PARENCOUNTER      := 0;
  1637.    KEYWORD [ FUNCSYM        ] := 'FUNCTION  ' ;
  1638.    KEYWORD [ PROCSYM        ] := 'PROCEDURE ' ;
  1639.    KEYWORD [ ABORTSYM       ] := 'ABORT     ' ; (* -- RLC -- *)
  1640.    KEYWORD [ ABSSYM         ] := 'ABS       ' ; (* -- RLC -- *)
  1641.    KEYWORD [ ACCESSSYM      ] := 'ACCESS    ' ; (* -- RLC -- *)
  1642.    KEYWORD [ ALLSYM         ] := 'ALL       ' ; (* -- RLC -- *)
  1643.    KEYWORD [ ANDSYM         ] := 'AND       ' ; (* -- RLC -- *)
  1644.    KEYWORD [ ARRAYSYM       ] := 'ARRAY     ' ; (* -- RLC -- *)
  1645.    KEYWORD [ ATSYM          ] := 'AT        ' ; (* -- RLC -- *)
  1646.    KEYWORD [ CONSTANTSYM    ] := 'CONSTANT  ' ; (* -- RLC -- *)
  1647.    KEYWORD [ DELAYSYM       ] := 'DELAY     ' ; (* -- RLC -- *)
  1648.    KEYWORD [ DELTASYM       ] := 'DELTA     ' ; (* -- RLC -- *)
  1649.    KEYWORD [ DIGITSSYM      ] := 'DIGITS    ' ; (* -- RLC -- *)
  1650.    KEYWORD [ ENTRYSYM       ] := 'ENTRY     ' ; (* -- RLC -- *)
  1651.    KEYWORD [ GOTOSYM        ] := 'GOTO      ' ; (* -- RLC -- *)
  1652.    KEYWORD [ INSYM          ] := 'IN        ' ; (* -- RLC -- *)
  1653.    KEYWORD [ LIMITEDSYM     ] := 'LIMITED   ' ; (* -- RLC -- *)
  1654.    KEYWORD [ MODSYM         ] := 'MOD       ' ; (* -- RLC -- *)
  1655.    KEYWORD [ NOTSYM         ] := 'NOT       ' ; (* -- RLC -- *)
  1656.    KEYWORD [ NULLSYM        ] := 'NULL      ' ; (* -- RLC -- *)
  1657.    KEYWORD [ OFSYM          ] := 'OF        ' ; (* -- RLC -- *)
  1658.    KEYWORD [ OTHERSSYM      ] := 'OTHERS    ' ; (* -- RLC -- *)
  1659.    KEYWORD [ OUTSYM         ] := 'OUT       ' ; (* -- RLC -- *)
  1660.    KEYWORD [ PRAGMASYM      ] := 'PRAGMA    ' ; (* -- RLC -- *)
  1661.    KEYWORD [ RAISESYM       ] := 'RAISE     ' ; (* -- RLC -- *)
  1662.    KEYWORD [ RANGESYM       ] := 'RANGE     ' ; (* -- RLC -- *)
  1663.    KEYWORD [ REMSYM         ] := 'REM       ' ; (* -- RLC -- *)
  1664.    KEYWORD [ RENAMESSYM     ] := 'RENAMES   ' ; (* -- RLC -- *)
  1665.    KEYWORD [ RETURNSYM      ] := 'RETURN    ' ; (* -- RLC -- *)
  1666.    KEYWORD [ REVERSESYM     ] := 'REVERSE   ' ; (* -- RLC -- *)
  1667.    KEYWORD [ SUBTYPESYM     ] := 'SUBTYPE   ' ; (* -- RLC -- *)
  1668.    KEYWORD [ TERMINATESYM   ] := 'TERMINATE ' ; (* -- RLC -- *)
  1669.    KEYWORD [ XORSYM         ] := 'XOR       ' ; (* -- RLC -- *)
  1670.    KEYWORD [ ISSYM          ] := 'IS        ' ;
  1671.    KEYWORD [ SPECIALISSYM   ] := 'IS        ' ;
  1672.    KEYWORD [ NEWSYM         ] := 'NEW       ' ;
  1673.    KEYWORD [ TYPESYM        ] := 'TYPE      ' ;
  1674.    KEYWORD [ BEGINSYM       ] := 'BEGIN     ' ;
  1675.    KEYWORD [ RECORDSYM      ] := 'RECORD    ' ;
  1676.    KEYWORD [ CASESYM        ] := 'CASE      ' ;
  1677.    KEYWORD [ FORSYM         ] := 'FOR       ' ;
  1678.    KEYWORD [ WHENSYM        ] := 'WHEN      ' ;
  1679.    KEYWORD [ WHILESYM       ] := 'WHILE     ' ;
  1680.    KEYWORD [ USESYM         ] := 'USE       ' ;
  1681.    KEYWORD [ SPECIALUSESYM  ] := 'USE       ' ;
  1682.    KEYWORD [ LOOPSYM        ] := 'LOOP      ' ;
  1683.    KEYWORD [ SPECIALLOOPSYM ] := 'LOOP      ' ;
  1684.    KEYWORD [ WITHSYM        ] := 'WITH      ' ;
  1685.    KEYWORD [ SPECIALWTH     ] := 'WITH      ' ; (*  CAW  *)
  1686.    KEYWORD [ DOSYM          ] := 'DO        ' ;
  1687.    KEYWORD [ IFSYM          ] := 'IF        ' ;
  1688.    KEYWORD [ THENSYM        ] := 'THEN      ' ;
  1689.    KEYWORD [ ELSESYM        ] := 'ELSE      ' ;
  1690.    KEYWORD [ ELSIFSYM       ] := 'ELSIF     ' ;
  1691.    KEYWORD [ ENDSYM         ] := 'END       ' ;
  1692.    KEYWORD [ EXITSYM        ] := 'EXIT      ' ;
  1693.    KEYWORD [ PACKAGESYM     ] := 'PACKAGE   ' ;
  1694.    KEYWORD [ SPECIALPKSYM   ] := 'PACKAGE   ' ; (*  CAW  *)
  1695.    KEYWORD [ TASKSYM        ] := 'TASK      ' ;
  1696.    KEYWORD [ GENERICSYM     ] := 'GENERIC   ' ;
  1697.    KEYWORD [ EXCEPTIONSYM   ] := 'EXCEPTION ' ;
  1698.    KEYWORD [ SPEXCEPTIONSYM ] := 'EXCEPTION ' ;
  1699.    KEYWORD [ PRIVATESYM     ] := 'PRIVATE   ' ;
  1700.    KEYWORD [ SELECTSYM      ] := 'SELECT    ' ;
  1701.    KEYWORD [ ORSYM          ] := 'OR        ' ;
  1702.    KEYWORD [ SPECIALORSYM   ] := 'OR        ' ;
  1703.    KEYWORD [ DECLARESYM     ] := 'DECLARE   ' ;
  1704.    KEYWORD [ SEPARATESYM    ] := 'SEPARATE  ' ;
  1705.    KEYWORD [ ACCEPTSYM      ] := 'ACCEPT    ' ;
  1706.    KEYWORD [ BODYSYM        ] := 'BODY      ' ;
  1707.    DBLCHARS := [ BECOMES, ARROWSYM,  OPENCOMMENT ];
  1708.    DBLCHAR [ BECOMES     ]  := ':=';
  1709.    DBLCHAR [ OPENCOMMENT ]  := '--';
  1710.    DBLCHAR [ ARROWSYM    ]  := '=>';
  1711.    SGLCHAR [ SEMICOLON    ] := ';' ;
  1712.    SGLCHAR [ SPSEMICOLON  ] := ';' ;
  1713.    SGLCHAR [ COLON        ] := ':' ;
  1714.    SGLCHAR [ SPECIALCOLON ] := ':' ;
  1715.    SGLCHAR [ UNDSCORE     ] := '_' ;
  1716.    SGLCHAR [ EQUALS       ] := '=' ;
  1717.    SGLCHAR [ OPENPAREN    ] := '(' ;
  1718.    SGLCHAR [ CLOSEPAREN   ] := ')' ;
  1719.    SGLCHAR [ PERIOD       ] := '.' ;
  1720.    LOOPSWITCH    := FALSE;
  1721.    USESWITCH     := FALSE;
  1722.    WITHSEEN      := FALSE;
  1723.    ORSWITCH      := FALSE;
  1724.    ISSWITCH      := FALSE;
  1725.    CRPENDING     := FALSE;
  1726.    GETCHAR( (* FROM INPUT *)
  1727.             (* UPDATING *)  NEXTCHAR,
  1728.             (* RETURNING *) CURRCHAR  );
  1729.    NEW(CURRSYM);
  1730.    NEW(NEXTSYM);
  1731.    GETSYMBOL( (* FROM INPUT *)
  1732.               (* UPDATING *)  NEXTSYM,
  1733.               (* RETURNING *) CURRSYM  );
  1734.    WITH PPOPTION [ FUNCSYM ] DO
  1735.       BEGIN
  1736.          OPTIONSSELECTED   := [ BLANKLINEBEFORE,
  1737.                                 GOBBLESYMBOLS  ,
  1738.                                 SPACEAFTER     ];
  1739.          GOBBLETERMINATORS := [ ISSYM,
  1740.                                 SEMICOLON      ];
  1741.       END;
  1742.    WITH PPOPTION [ ABORTSYM ] DO  (* -- RLC -- *)
  1743.       BEGIN
  1744.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1745.                                 SPACEAFTER     ];
  1746.          GOBBLETERMINATORS := [ ]
  1747.       END;
  1748.    WITH PPOPTION [ ABSSYM ] DO  (* -- RLC -- *)
  1749.       BEGIN
  1750.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1751.                                 SPACEAFTER     ];
  1752.          GOBBLETERMINATORS := [ ]
  1753.       END;
  1754.    WITH PPOPTION [ ACCESSSYM ] DO  (* -- RLC -- *)
  1755.       BEGIN
  1756.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1757.                                 SPACEAFTER     ];
  1758.          GOBBLETERMINATORS := [ ]
  1759.       END;
  1760.    WITH PPOPTION [ ALLSYM ] DO  (* -- RLC -- *)
  1761.       BEGIN
  1762.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1763.                                 SPACEAFTER     ];
  1764.          GOBBLETERMINATORS := [ ]
  1765.       END;
  1766.    WITH PPOPTION [ ANDSYM ] DO  (* -- RLC -- *)
  1767.       BEGIN
  1768.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1769.                                 SPACEAFTER     ];
  1770.          GOBBLETERMINATORS := [ ]
  1771.       END;
  1772.    WITH PPOPTION [ ARRAYSYM ] DO  (* -- RLC -- *)
  1773.       BEGIN
  1774.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1775.                                 SPACEAFTER     ];
  1776.          GOBBLETERMINATORS := [ ]
  1777.       END;
  1778.    WITH PPOPTION [ ATSYM ] DO  (* -- RLC -- *)
  1779.       BEGIN
  1780.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1781.                                 SPACEAFTER     ];
  1782.          GOBBLETERMINATORS := [ ]
  1783.       END;
  1784.    WITH PPOPTION [ CONSTANTSYM ] DO  (* -- RLC -- *)
  1785.       BEGIN
  1786.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1787.                                 SPACEAFTER     ];
  1788.          GOBBLETERMINATORS := [ ]
  1789.       END;
  1790.    WITH PPOPTION [ DELAYSYM ] DO  (* -- RLC -- *)
  1791.       BEGIN
  1792.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1793.                                 SPACEAFTER     ];
  1794.          GOBBLETERMINATORS := [ ]
  1795.       END;
  1796.    WITH PPOPTION [ DELTASYM ] DO  (* -- RLC -- *)
  1797.       BEGIN
  1798.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1799.                                 SPACEAFTER     ];
  1800.          GOBBLETERMINATORS := [ ]
  1801.       END;
  1802.    WITH PPOPTION [ DIGITSSYM ] DO  (* -- RLC -- *)
  1803.       BEGIN
  1804.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1805.                                 SPACEAFTER     ];
  1806.          GOBBLETERMINATORS := [ ]
  1807.       END;
  1808.    WITH PPOPTION [ ENTRYSYM ] DO  (* -- RLC -- *)
  1809.       BEGIN
  1810.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1811.                                 SPACEAFTER     ];
  1812.          GOBBLETERMINATORS := [ ]
  1813.       END;
  1814.    WITH PPOPTION [ GOTOSYM ] DO  (* -- RLC -- *)
  1815.       BEGIN
  1816.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1817.                                 SPACEAFTER     ];
  1818.          GOBBLETERMINATORS := [ ]
  1819.       END;
  1820.    WITH PPOPTION [ INSYM ] DO  (* -- RLC -- *)
  1821.       BEGIN
  1822.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1823.                                 SPACEAFTER     ];
  1824.          GOBBLETERMINATORS := [ ]
  1825.       END;
  1826.    WITH PPOPTION [ LIMITEDSYM ] DO  (* -- RLC -- *)
  1827.       BEGIN
  1828.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1829.                                 SPACEAFTER     ];
  1830.          GOBBLETERMINATORS := [ ]
  1831.       END;
  1832.    WITH PPOPTION [ MODSYM ] DO  (* -- RLC -- *)
  1833.       BEGIN
  1834.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1835.                                 SPACEAFTER     ];
  1836.          GOBBLETERMINATORS := [ ]
  1837.       END;
  1838.    WITH PPOPTION [ NOTSYM ] DO  (* -- RLC -- *)
  1839.       BEGIN
  1840.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1841.                                 SPACEAFTER     ];
  1842.          GOBBLETERMINATORS := [ ]
  1843.       END;
  1844.    WITH PPOPTION [ NULLSYM ] DO  (* -- RLC -- *)
  1845.       BEGIN
  1846.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1847.                                 SPACEAFTER     ];
  1848.          GOBBLETERMINATORS := [ ]
  1849.       END;
  1850.    WITH PPOPTION [ OFSYM ] DO  (* -- RLC -- *)
  1851.       BEGIN
  1852.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1853.                                 SPACEAFTER     ];
  1854.          GOBBLETERMINATORS := [ ]
  1855.       END;
  1856.    WITH PPOPTION [ OTHERSSYM ] DO  (* -- RLC -- *)
  1857.       BEGIN
  1858.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1859.                                 SPACEAFTER     ];
  1860.          GOBBLETERMINATORS := [ ]
  1861.       END;
  1862.    WITH PPOPTION [ OUTSYM ] DO  (* -- RLC -- *)
  1863.       BEGIN
  1864.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1865.                                 SPACEAFTER     ];
  1866.          GOBBLETERMINATORS := [ ]
  1867.       END;
  1868.    WITH PPOPTION [ PRAGMASYM ] DO  (* -- RLC -- *)
  1869.       BEGIN
  1870.          OPTIONSSELECTED   := [ SPACEAFTER     ];
  1871.          GOBBLETERMINATORS := [ ]
  1872.       END;
  1873.    WITH PPOPTION [ RAISESYM ] DO  (* -- RLC -- *)
  1874.       BEGIN
  1875.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1876.                                 SPACEAFTER     ];
  1877.          GOBBLETERMINATORS := [ ]
  1878.       END;
  1879.    WITH PPOPTION [ RANGESYM ] DO  (* -- RLC -- *)
  1880.       BEGIN
  1881.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1882.                                 SPACEAFTER     ];
  1883.          GOBBLETERMINATORS := [ ]
  1884.       END;
  1885.    WITH PPOPTION [ REMSYM ] DO  (* -- RLC -- *)
  1886.       BEGIN
  1887.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1888.                                 SPACEAFTER     ];
  1889.          GOBBLETERMINATORS := [ ]
  1890.       END;
  1891.    WITH PPOPTION [ RENAMESSYM ] DO  (* -- RLC -- *)
  1892.       BEGIN
  1893.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1894.                                 SPACEAFTER     ];
  1895.          GOBBLETERMINATORS := [ ]
  1896.       END;
  1897.    WITH PPOPTION [ RETURNSYM ] DO  (* -- RLC -- *)
  1898.       BEGIN
  1899.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1900.                                 SPACEAFTER     ];
  1901.          GOBBLETERMINATORS := [ ]
  1902.       END;
  1903.    WITH PPOPTION [ REVERSESYM ] DO  (* -- RLC -- *)
  1904.       BEGIN
  1905.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1906.                                 SPACEAFTER     ];
  1907.          GOBBLETERMINATORS := [ ]
  1908.       END;
  1909.    WITH PPOPTION [ SUBTYPESYM ] DO  (* -- RLC -- *)
  1910.       BEGIN
  1911.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1912.                                 SPACEAFTER     ];
  1913.          GOBBLETERMINATORS := [ ]
  1914.       END;
  1915.    WITH PPOPTION [ TERMINATESYM ] DO  (* -- RLC -- *)
  1916.       BEGIN
  1917.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1918.                                 SPACEAFTER     ];
  1919.          GOBBLETERMINATORS := [ ]
  1920.       END;
  1921.    WITH PPOPTION [ XORSYM ] DO  (* -- RLC -- *)
  1922.       BEGIN
  1923.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1924.                                 SPACEAFTER     ];
  1925.          GOBBLETERMINATORS := [ ]
  1926.       END;
  1927.    WITH PPOPTION [ PROCSYM ] DO
  1928.       BEGIN
  1929.          OPTIONSSELECTED   := [ BLANKLINEBEFORE,
  1930.                                 GOBBLESYMBOLS  ,
  1931.                                 SPACEAFTER     ];
  1932.          GOBBLETERMINATORS := [ ISSYM,
  1933.                                 OPENCOMMENT,
  1934.                                 SEMICOLON      ];
  1935.       END;
  1936.    WITH PPOPTION [ SPECIALISSYM ] DO
  1937.       BEGIN
  1938.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1939.                                 INDENTMARGIN   ,
  1940.                                 CRAFTER        ];
  1941.          GOBBLETERMINATORS := [ ]
  1942.       END;
  1943.    WITH PPOPTION [ ISSYM ] DO
  1944.       BEGIN
  1945.          OPTIONSSELECTED   := [ SPACEAFTER     ,
  1946.                                 GOBBLESYMBOLS  ];
  1947.          GOBBLETERMINATORS := [ SEMICOLON      ,
  1948.                                  RECORDSYM     ]
  1949.      END;
  1950.    WITH PPOPTION [ NEWSYM ] DO  (* -- RLC -- *)
  1951.       BEGIN
  1952.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  1953.                                 SPACEAFTER     ];
  1954.          GOBBLETERMINATORS := []
  1955.       END;
  1956.    WITH PPOPTION [ TYPESYM ] DO
  1957.       BEGIN
  1958.           OPTIONSSELECTED   := [ SPACEAFTER   ,
  1959.                                  GOBBLESYMBOLS];
  1960.           GOBBLETERMINATORS := [ SEMICOLON    ,
  1961.                                  RECORDSYM    ,
  1962.                                  ISSYM        ]
  1963.       END;
  1964.    WITH PPOPTION [ TASKSYM ] DO
  1965.       BEGIN
  1966.          OPTIONSSELECTED   := [ BLANKLINEBEFORE,
  1967.                                 GOBBLESYMBOLS  ];
  1968.          GOBBLETERMINATORS := [ ISSYM          ,
  1969.                                 BODYSYM        ,
  1970.                                 SEMICOLON      ]
  1971.       END;
  1972.    WITH PPOPTION [ GENERICSYM ] DO
  1973.       BEGIN
  1974.          OPTIONSSELECTED   := [ BLANKLINEBEFORE,
  1975.                                 CRAFTER        ];
  1976.          GOBBLETERMINATORS := []
  1977.       END;
  1978.  
  1979.    WITH PPOPTION [ SPECIALPKSYM] DO  (*  CAW  *)
  1980.       BEGIN
  1981.          OPTIONSSELECTED   := [ BLANKLINEBEFORE,
  1982.                                 GOBBLESYMBOLS  ];
  1983.          GOBBLETERMINATORS := [ NEWSYM         ,
  1984.                                 SEMICOLON      ];
  1985.       END;
  1986.  
  1987.    WITH PPOPTION [ PACKAGESYM ] DO
  1988.       BEGIN
  1989.          OPTIONSSELECTED   := [ BLANKLINEBEFORE,
  1990.                                 GOBBLESYMBOLS  ];
  1991.          GOBBLETERMINATORS := [ ISSYM          ,
  1992.                                 BODYSYM        ,
  1993.                                 SEMICOLON      ]
  1994.       END;
  1995.    WITH PPOPTION [ BEGINSYM ] DO
  1996.       BEGIN
  1997.          OPTIONSSELECTED   := [ INDENTBYTAB    ,
  1998.                                 DINDENT        ,
  1999.                                 CRAFTER        ];
  2000.          GOBBLETERMINATORS := []
  2001.       END;
  2002.    WITH PPOPTION [ USESYM ] DO
  2003.       BEGIN
  2004.          OPTIONSSELECTED   := [];
  2005.          GOBBLETERMINATORS := []
  2006.       END;
  2007.    WITH PPOPTION [ SPECIALUSESYM ] DO
  2008.       BEGIN
  2009.          OPTIONSSELECTED   := [ DINDENT        ];
  2010.          GOBBLETERMINATORS := []
  2011.       END;
  2012.    WITH PPOPTION [ RECORDSYM ] DO
  2013.       BEGIN
  2014.          OPTIONSSELECTED   := [ CRAFTER        ,
  2015.                                 CRSUPPRESS     ,
  2016.                                 INDENTMARGIN   ];
  2017.          GOBBLETERMINATORS := []
  2018.       END;
  2019.    WITH PPOPTION [ CASESYM ] DO
  2020.       BEGIN
  2021.          OPTIONSSELECTED   := [ SPACEAFTER     ,
  2022.                                 CRBEFORE       ,  (* -- RLC -- *)
  2023.                                 GOBBLESYMBOLS  ];
  2024.          GOBBLETERMINATORS := [ ISSYM          ]
  2025.       END;
  2026.    WITH PPOPTION [ EXITSYM ] DO
  2027.       BEGIN
  2028.          OPTIONSSELECTED   := [ SPACEAFTER     ,
  2029.                                 GOBBLESYMBOLS  ];
  2030.          GOBBLETERMINATORS := [ SEMICOLON      ]
  2031.       END;
  2032.    WITH PPOPTION [ FORSYM ] DO
  2033.       BEGIN
  2034.          OPTIONSSELECTED   := [ SPACEAFTER     ,
  2035.                                 CRBEFORE       ,
  2036.                                 INDENTBYTAB    ,
  2037.                                 GOBBLESYMBOLS  ];
  2038.          GOBBLETERMINATORS := [ SPECIALLOOPSYM ,
  2039.                                 SPECIALUSESYM  ,
  2040.                                 USESYM         ]
  2041.       END;
  2042.    WITH PPOPTION [ SPECIALLOOPSYM ] DO
  2043.       BEGIN
  2044.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  2045.                                 CRSUPPRESS     ,
  2046.                                 CRAFTER        ];
  2047.          GOBBLETERMINATORS := []
  2048.       END;
  2049.    WITH PPOPTION [ LOOPSYM ] DO
  2050.       BEGIN
  2051.          OPTIONSSELECTED   := [ INDENTBYTAB    ,
  2052.                                 CRAFTER        ];
  2053.          GOBBLETERMINATORS := []
  2054.       END;
  2055.    WITH PPOPTION [ WHILESYM ] DO
  2056.       BEGIN
  2057.          OPTIONSSELECTED   := [ SPACEAFTER     ,
  2058.                                 CRBEFORE       ,
  2059.                                 INDENTBYTAB    ,
  2060.                                 GOBBLESYMBOLS  ];
  2061.          GOBBLETERMINATORS := [ SPECIALLOOPSYM ,
  2062.                                 OPENCOMMENT    ]
  2063.       END;
  2064.    WITH PPOPTION [ SPECIALWTH ] DO  (*  CAW  *)
  2065.       BEGIN
  2066.          OPTIONSSELECTED   := [ BLANKLINEBEFORE,
  2067.                                 GOBBLESYMBOLS  ,
  2068.                                 SPACEAFTER     ];
  2069.          GOBBLETERMINATORS := [ SEMICOLON      ];
  2070.       END;
  2071.    WITH PPOPTION [ WITHSYM ] DO
  2072.       BEGIN
  2073.          OPTIONSSELECTED   := [ SPACEAFTER     ];
  2074.          GOBBLETERMINATORS := []
  2075.       END;
  2076.    WITH PPOPTION [ DOSYM ] DO
  2077.       BEGIN
  2078.          OPTIONSSELECTED   := [ CRSUPPRESS     ,
  2079.                                 SPACEBEFORE    ,
  2080.                                 INDENTMARGIN   ,
  2081.                                 CRAFTER        ];
  2082.          GOBBLETERMINATORS := []
  2083.       END;
  2084.    WITH PPOPTION [ IFSYM ] DO
  2085.       BEGIN
  2086.          OPTIONSSELECTED   := [ SPACEAFTER     ,
  2087.                                 CRBEFORE       ,
  2088.                                 INDENTBYTAB    ,
  2089.                                 GOBBLESYMBOLS  ];
  2090.          GOBBLETERMINATORS := [ THENSYM        ,
  2091.                                 OPENCOMMENT   ]
  2092.       END;
  2093.    WITH PPOPTION [ THENSYM ] DO
  2094.       BEGIN
  2095.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  2096.                                 CRAFTER        ];
  2097.          GOBBLETERMINATORS := []
  2098.       END;
  2099.    WITH PPOPTION [ ELSESYM ] DO
  2100.       BEGIN
  2101.          OPTIONSSELECTED   := [ CRBEFORE       ,
  2102.                                 DINDENT        ,
  2103.                                 INDENTBYTAB    ,
  2104.                                 CRAFTER        ];
  2105.          GOBBLETERMINATORS := []
  2106.       END;
  2107.    WITH PPOPTION [ ELSIFSYM ] DO
  2108.       BEGIN
  2109.          OPTIONSSELECTED   := [ DINDENT        ,
  2110.                                 CRBEFORE       ,
  2111.                                 INDENTBYTAB    ,
  2112.                                 GOBBLESYMBOLS  ];
  2113.          GOBBLETERMINATORS := [ THENSYM        ];
  2114.      END;
  2115.    WITH PPOPTION [ ENDSYM ] DO
  2116.       BEGIN
  2117.          OPTIONSSELECTED   := [ DINDENT        ,
  2118.                                 GOBBLESYMBOLS  ,
  2119.                                 CRBEFORE       ];
  2120.          GOBBLETERMINATORS := [ SEMICOLON      ];
  2121.       END;
  2122.    WITH PPOPTION [ WHENSYM ] DO
  2123.       BEGIN
  2124.          OPTIONSSELECTED   := [ INDENTBYTAB    ,
  2125.                                 CRBEFORE       ,  (* -- RLC -- *)
  2126.                                 GOBBLESYMBOLS  ];
  2127.          GOBBLETERMINATORS := [ ARROWSYM       ]
  2128.       END;
  2129.    WITH PPOPTION [ EXCEPTIONSYM ] DO
  2130.       BEGIN
  2131.          OPTIONSSELECTED   := [ BLANKLINEBEFORE,
  2132.                                 INDENTBYTAB    ];
  2133.          GOBBLETERMINATORS := []
  2134.       END;
  2135.    WITH PPOPTION [ SPEXCEPTIONSYM ] DO
  2136.       BEGIN
  2137.          OPTIONSSELECTED   := [];
  2138.          GOBBLETERMINATORS := []
  2139.       END;
  2140.    WITH PPOPTION [ PRIVATESYM ] DO
  2141.       BEGIN
  2142.          OPTIONSSELECTED   := [ BLANKLINEBEFORE,
  2143.                                 INDENTBYTAB    ,
  2144.                                 CRAFTER        ];
  2145.          GOBBLETERMINATORS := []
  2146.       END;
  2147.    WITH PPOPTION [ ACCEPTSYM ] DO
  2148.       BEGIN
  2149.          OPTIONSSELECTED   := [];
  2150.          GOBBLETERMINATORS := []
  2151.       END;
  2152.    WITH PPOPTION [ SELECTSYM ] DO
  2153.       BEGIN
  2154.          OPTIONSSELECTED   := [ CRBEFORE       ,
  2155.                                 INDENTBYTAB    ,
  2156.                                 CRAFTER        ];
  2157.          GOBBLETERMINATORS := []
  2158.       END;
  2159.    WITH PPOPTION [ BODYSYM ] DO
  2160.       BEGIN
  2161.          OPTIONSSELECTED   := [ GOBBLESYMBOLS  ];
  2162.          GOBBLETERMINATORS := [ ISSYM          ,
  2163.                                 SEMICOLON      ];
  2164.       END;
  2165.    WITH PPOPTION [ ORSYM ] DO
  2166.       BEGIN
  2167.          OPTIONSSELECTED   := [];
  2168.          GOBBLETERMINATORS := []
  2169.       END;
  2170.    WITH PPOPTION [ SPECIALORSYM ] DO
  2171.       BEGIN
  2172.          OPTIONSSELECTED   := [ CRBEFORE       ,
  2173.                                 DINDENT        ,
  2174.                                 INDENTBYTAB    ,
  2175.                                 CRAFTER        ];
  2176.          GOBBLETERMINATORS := []
  2177.       END;
  2178.    WITH PPOPTION [ DECLARESYM ] DO
  2179.       BEGIN
  2180.          OPTIONSSELECTED   := [ CRBEFORE       ,
  2181.                                 INDENTBYTAB    ,
  2182.                                 CRAFTER        ];
  2183.          GOBBLETERMINATORS := []
  2184.       END;
  2185.    WITH PPOPTION [ SEPARATESYM ] DO
  2186.       BEGIN
  2187.          OPTIONSSELECTED   := [ BLANKLINEBEFORE ];
  2188.          GOBBLETERMINATORS := []
  2189.       END;
  2190.    WITH PPOPTION [ ARROWSYM ] DO
  2191.       BEGIN
  2192.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  2193.                                 CRSUPPRESS     ,
  2194.                                 CRAFTER        ];
  2195.          GOBBLETERMINATORS := []
  2196.       END;
  2197.    WITH PPOPTION [ BECOMES ] DO
  2198.       BEGIN
  2199.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  2200.                                 SPACEAFTER     ,
  2201.                                 GOBBLESYMBOLS  ];
  2202.          GOBBLETERMINATORS := [ SEMICOLON      ]
  2203.       END;
  2204.    WITH PPOPTION [ OPENCOMMENT ] DO
  2205.       BEGIN
  2206.          OPTIONSSELECTED   := [ CRSUPPRESS     ,
  2207.                                 CRAFTER        ];
  2208.          GOBBLETERMINATORS := []
  2209.       END;
  2210.    WITH PPOPTION [ SEMICOLON ] DO
  2211.       BEGIN
  2212.          OPTIONSSELECTED   := [ CRAFTER        ];
  2213.          GOBBLETERMINATORS := []
  2214.       END;
  2215.    WITH PPOPTION [ SPSEMICOLON ] DO
  2216.       BEGIN
  2217.          OPTIONSSELECTED   := [ CRSUPPRESS     ];
  2218.          GOBBLETERMINATORS := []
  2219.       END;
  2220.    WITH PPOPTION [ COLON ] DO
  2221.       BEGIN
  2222.          OPTIONSSELECTED   := [ SPACEAFTER     ];
  2223.          GOBBLETERMINATORS := []
  2224.       END;
  2225.    WITH PPOPTION [ SPECIALCOLON ] DO
  2226.       BEGIN
  2227.          OPTIONSSELECTED   := [ CRAFTER        ];
  2228.          GOBBLETERMINATORS := []
  2229.       END;
  2230.    WITH PPOPTION [ EQUALS ] DO
  2231.       BEGIN
  2232.          OPTIONSSELECTED   := [ SPACEBEFORE    ,
  2233.                                 SPACEAFTER     ];
  2234.          GOBBLETERMINATORS := []
  2235.       END;
  2236.    WITH PPOPTION [ OPENPAREN ] DO
  2237.       BEGIN
  2238.          OPTIONSSELECTED   := [ GOBBLESYMBOLS  ];
  2239.          GOBBLETERMINATORS := [ CLOSEPAREN     ]
  2240.       END;
  2241.    WITH PPOPTION [ CLOSEPAREN ] DO
  2242.       BEGIN
  2243.          OPTIONSSELECTED   := [];
  2244.          GOBBLETERMINATORS := []
  2245.       END;
  2246.    WITH PPOPTION [ PERIOD ] DO
  2247.       BEGIN
  2248.          OPTIONSSELECTED   := [ CRSUPPRESS     ];
  2249.          GOBBLETERMINATORS := []
  2250.       END;
  2251.    WITH PPOPTION [ ENDOFFILE ] DO
  2252.       BEGIN
  2253.          OPTIONSSELECTED   := [];
  2254.          GOBBLETERMINATORS := []
  2255.       END;
  2256.    WITH PPOPTION [ OTHERSYM ] DO
  2257.       BEGIN
  2258.          OPTIONSSELECTED   := [];
  2259.          GOBBLETERMINATORS := []
  2260.       END
  2261. END; (* INITIALIZE *)
  2262. (*=********************************************************************)
  2263. (**********************************************************************)
  2264. (***                                                                ***)
  2265. (***   NAME                                                         ***)
  2266. (***                STACKEMPTY                                      ***)
  2267. (***                                                                ***)
  2268. (***   DESCRIPTION                                                  ***)
  2269. (***                                                                ***)
  2270. (***                  THIS FUNCTION CHECKS TO ENSURE THAT THE       ***)
  2271. (***              STACK IS NOT EMPTY.  THIS IS ACCOMPLISHED BY      ***)
  2272. (***              EXAMINATION OF THE TOP OF THE STACK INDICATOR,    ***)
  2273. (***              "TOP". IF ZERO THEN THIS FUNCTION RETURNS A       ***)
  2274. (***              VALUE OF FALSE, OTHERWISE TRUE IS RETURNED.       ***)
  2275. (***                                                                ***)
  2276. (***   INPUTS                                                       ***)
  2277. (***              TOP----TOP OF STACK INDICATOR                     ***)
  2278. (***                                                                ***)
  2279. (***   OUTPUTS                                                      ***)
  2280. (***              STACKEMPTY--EQUAL TRUE IF "TOP" EQUALS ZERO,      ***)
  2281. (***                          OTHERWISE FALSE.                      ***)
  2282. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2283. (***                   NONE                                         ***)
  2284. (***                                                                ***)
  2285. (***   REFERENCED BY                                                ***)
  2286. (***                   LSHIFT                                       ***)
  2287. (***                                                                ***)
  2288. (**********************************************************************)
  2289. FUNCTION STACKEMPTY (* RETURNING *) : BOOLEAN;
  2290. BEGIN (* STACKEMPTY *)
  2291.    IF TOP = 0
  2292.       THEN
  2293.          STACKEMPTY := TRUE
  2294.       ELSE
  2295.          STACKEMPTY := FALSE
  2296. END; (* STACKEMPTY *)
  2297. (*=********************************************************************)
  2298. (**********************************************************************)
  2299. (***                                                                ***)
  2300. (***   NAME                                                         ***)
  2301. (***                 STACKFULL                                      ***)
  2302. (***                                                                ***)
  2303. (***   DESCRIPTION                                                  ***)
  2304. (***                                                                ***)
  2305. (***              THIS FUNCTON CHECKS TO ENSURE THAT THE            ***)
  2306. (***         STACK IS NOT FULL.  THIS IS ACCOMPLISHED BY            ***)
  2307. (***         EXAMINTION OF THE TOP-OF-THE-STACK INDICATOR,          ***)
  2308. (***         "TOP".  IF IT EQUALS THE MAXIMUN THEN THIS             ***)
  2309. (***         RETURNS TRUE, OTHERWISE FALSE IS RETURNED.             ***)
  2310. (***                                                                ***)
  2311. (***   INPUTS                                                       ***)
  2312. (***         TOP---TOP-OF-THE-STACK INDICATOR                       ***)
  2313. (***                                                                ***)
  2314. (***   OUTPUTS                                                      ***)
  2315. (***         STACKFULL--EQUALS TRUE IF TOP EQUAL MAXSTACKSIZE,      ***)
  2316. (***                    OTHERWISE FALSE                             ***)
  2317. (***                                                                ***)
  2318. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2319. (***                   NONE                                         ***)
  2320. (***                                                                ***)
  2321. (***   REFERENCED BY                                                ***)
  2322. (***                   RSHIFT                                       ***)
  2323. (***                   PRINTENDIDENTIFIER                           ***)
  2324. (***                                                                ***)
  2325. (**********************************************************************)
  2326. FUNCTION STACKFULL (* RETURNING *) : BOOLEAN;
  2327. BEGIN (* STACKFULL *)
  2328.    IF TOP = MAXSTACKSIZE
  2329.       THEN
  2330.          STACKFULL := TRUE
  2331.       ELSE
  2332.          STACKFULL := FALSE
  2333. END; (* STACKFULL *)
  2334. (*=********************************************************************)
  2335. (**********************************************************************)
  2336. (***                                                                ***)
  2337. (***   NAME                                                         ***)
  2338. (***                   PUSHSTACK                                    ***)
  2339. (***                                                                ***)
  2340. (***   DESCRIPTION                                                  ***)
  2341. (***                                                                ***)
  2342. (***             THIS PROCEDURE SAVES THE RECORD ENDIDENTIFIER      ***)
  2343. (***         ONTO THE STACK FOR LATER RETREIVAL.  THIS IS USED      ***)
  2344. (***         TO SAVE THE VALUE OF THE ENDIDENTIFIER SYMBOL FOR      ***)
  2345. (***         FOR AUTOMATIC INSERTION FOLLOWING AN "END" IF ONE      ***)
  2346. (***         IS NOT ALREADY PRESENT.                                ***)
  2347. (***                                                                ***)
  2348. (***   INPUTS                                                       ***)
  2349. (***         TOP -------TOP-OF-THE-STACK INDICATOR                  ***)
  2350. (***         PREVMARGIN                                             ***)
  2351. (***         ENDSYMBOL                                              ***)
  2352. (***         LLENGTH                                                ***)
  2353. (***                                                                ***)
  2354. (***   OUTPUTS                                                      ***)
  2355. (***         TOP ------UPDATED VALUE                                ***)
  2356. (***                                                                ***)
  2357. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2358. (***                   NONE                                         ***)
  2359. (***                                                                ***)
  2360. (***   REFERENCED BY                                                ***)
  2361. (***                   RSHIFT                                       ***)
  2362. (***                   PRETTYPRINT                                  ***)
  2363. (***                                                                ***)
  2364. (**********************************************************************)
  2365. PROCEDURE PUSHSTACK( INDENTSYMBOL : KEYSYMBOL;
  2366.                      PREVMARGIN     : INTEGER;
  2367.                      ENDSYMBOL      : STRING;
  2368.                      LLENGTH        : INTEGER );
  2369. BEGIN (* PUSHSTACK *)
  2370.    TOP := TOP + 1;
  2371.    STACK[TOP].PREVMARGIN   := PREVMARGIN;
  2372.    STACK[TOP].ENDSYMBOL    := ENDSYMBOL;
  2373.    STACK[TOP].LLENGTH      := LLENGTH;
  2374. END; (* PUSHSTACK *)
  2375.  
  2376. (*=********************************************************************)
  2377. (**********************************************************************)
  2378. (***                                                                ***)
  2379. (***   NAME                                                         ***)
  2380. (***                 INSERTCR                                       ***)
  2381. (***                                                                ***)
  2382. (***   DESCRIPTION                                                  ***)
  2383. (***                                                                ***)
  2384. (***              THIS PROCEDURE CHECKS TO SEE IF A NEW LINE IS     ***)
  2385. (***         INDICATED PRIOR TO THE OUTPUTTING OF THE CURRENT       ***)
  2386. (***         SYMBOL.  IF NOT, THEN A CALL "PROCEDURE WRITECRS"      ***)
  2387. (***         IS MADE TO OUTPUT A CARRIAGE RETURN.                   ***)
  2388. (***                                                                ***)
  2389. (***                                                                ***)
  2390. (***                                                                ***)
  2391. (***   INPUTS                                                       ***)
  2392. (***          CURRSYM^.CRSBEFORE -- NUMBER OF CARRIAGE RETURNS      ***)
  2393. (***                                INDICATED PRIOR TO THE OUT-     ***)
  2394. (***                                PUTTING OF THE CURRENT SYMBOL   ***)
  2395. (***                                                                ***)
  2396. (***   OUTPUTS                                                      ***)
  2397. (***          CURRSYM^.SPACESBEFORE-- SET TO ZERO                   ***)
  2398. (***                                                                ***)
  2399. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2400. (***                   WRITECRS                                     ***)
  2401. (***                                                                ***)
  2402. (***   REFERENCED BY                                                ***)
  2403. (***                   PRETTYPRINT                                  ***)
  2404. (***                                                                ***)
  2405. (**********************************************************************)
  2406. PROCEDURE INSERTCR( (* UPDATING *)   VAR CURRSYM    : SYMBOLINFO
  2407.                     (* WRITING TO OUTPUT *)                     );
  2408. CONST
  2409.       ONCE = 1;
  2410. BEGIN (* INSERTCR *)
  2411.    IF CURRSYM^.CRSBEFORE = 0
  2412.       THEN
  2413.          BEGIN
  2414.             WRITECRS( ONCE, (* UPDATING *)   CURRLINEPOS
  2415.                             (* WRITING TO OUTPUT *)       );
  2416.             CURRSYM^.SPACESBEFORE := 0
  2417.          END
  2418. END; (* INSERTCR *)
  2419. (*=********************************************************************)
  2420. (**********************************************************************)
  2421. (***                                                                ***)
  2422. (***   NAME                                                         ***)
  2423. (***                      INSERTBLANKLINE                           ***)
  2424. (***                                                                ***)
  2425. (***   DESCRIPTION                                                  ***)
  2426. (***              THIS PROCEDURE CAUSES A BLANKLINE TO BE WRITTEN   ***)
  2427. (***         ON THE OUTPUT FILE IF ONE IS NOT ALREADY REQUIRED.     ***)
  2428. (***                                                                ***)
  2429. (***   INPUTS                                                       ***)
  2430. (***           CURRSYM^.CRSBEFORE--- CHECKS TO SEE IF A BLANK-      ***)
  2431. (***                                 LINE IS INDICATED ALREADY      ***)
  2432. (***                                                                ***)
  2433. (***           CURRLINEPOS --------- OF THE OUTPUT FILE             ***)
  2434. (***                                                                ***)
  2435. (***                                                                ***)
  2436. (***   OUTPUTS                                                      ***)
  2437. (***           CURRSYM^.SPACESBEFORE-- SET TO ZERO IF A BLANK-      ***)
  2438. (***                                   LINE IS INSERTED             ***)
  2439. (***                                                                ***)
  2440. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2441. (***                   WRITECRS                                     ***)
  2442. (***                                                                ***)
  2443. (***   REFERENCED BY                                                ***)
  2444. (***                   PRETTYPRINT                                  ***)
  2445. (***                                                                ***)
  2446. (**********************************************************************)
  2447. PROCEDURE INSERTBLANKLINE( (* UPDATING *)   VAR CURRSYM : SYMBOLINFO
  2448.                            (* WRITING TO OUTPUT *)                  );
  2449. CONST
  2450.       ONCE  = 1;
  2451.       TWICE = 2;
  2452. BEGIN (* INSERTBLANKLINE *)
  2453.    IF CURRSYM^.CRSBEFORE = 0
  2454.       THEN
  2455.          BEGIN
  2456.             IF CURRLINEPOS = 0
  2457.                THEN
  2458.                   WRITECRS( ONCE, (* UPDATING *)   CURRLINEPOS
  2459.                                  (* WRITING TO OUTPUT *)     )
  2460.                ELSE
  2461.                   WRITECRS( TWICE, (* UPDATING *)   CURRLINEPOS
  2462.                                    (* WRITING TO OUTPUT *)      );
  2463.             CURRSYM^.SPACESBEFORE := 0
  2464.          END
  2465.       ELSE
  2466.          IF CURRSYM^.CRSBEFORE = 1
  2467.             THEN
  2468.                IF CURRLINEPOS > 0
  2469.                   THEN
  2470.                      WRITECRS( ONCE, (* UPDATING *)   CURRLINEPOS
  2471.                                       (* WRITING TO OUTPUT *)      )
  2472. END; (* INSERTBLANKLINE *)
  2473. (*=********************************************************************)
  2474. (**********************************************************************)
  2475. (***                                                                ***)
  2476. (***   NAME                                                         ***)
  2477. (***                        LSHIFT                                  ***)
  2478. (***                                                                ***)
  2479. (***   DESCRIPTION                                                  ***)
  2480. (***                                                                ***)
  2481. (***              THIS PROCEDURE CAUSE THE MARGIN TO BE RESET       ***)
  2482. (***          TO THE VALUE WHICH IS WAS PREVIOUSLY.  THIS VALUE     ***)
  2483. (***          VALUE IS OBTSAINED FROM THE TOP OF THE STACK.         ***)
  2484. (***                                                                ***)
  2485. (***                                                                ***)
  2486. (***                                                                ***)
  2487. (***   INPUTS                                                       ***)
  2488. (***          STACK[TOP]                                            ***)
  2489. (***          TOP                                                   ***)
  2490. (***                                                                ***)
  2491. (***   OUTPUTS                                                      ***)
  2492. (***          TOP                                                   ***)
  2493. (***          CURRMARGIN                                            ***)
  2494. (***          ENDIDENTIFIER                                         ***)
  2495. (***                                                                ***)
  2496. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2497. (***                    STACKEMPTY                                  ***)
  2498. (***                                                                ***)
  2499. (***   REFERENCED BY                                                ***)
  2500. (***                    GOBBLE                                      ***)
  2501. (***                    PRETTYPRINT                                 ***)
  2502. (***                                                                ***)
  2503. (**********************************************************************)
  2504. PROCEDURE LSHIFT;
  2505. BEGIN (* LSHIFT *)
  2506.    IF NOT STACKEMPTY
  2507.       THEN
  2508.          BEGIN
  2509.             CURRMARGIN              := STACK[TOP].PREVMARGIN;
  2510.             ENDIDENTIFIER.ENDSYMBOL := STACK[TOP].ENDSYMBOL;
  2511.             ENDIDENTIFIER.LLENGTH   := STACK[TOP].LLENGTH;
  2512.             TOP                     := TOP - 1
  2513.          END
  2514.       ELSE
  2515.          PREVMARGIN                 := 0
  2516. END; (* LSHIFT *)
  2517. (*=********************************************************************)
  2518. (**********************************************************************)
  2519. (***                                                                ***)
  2520. (***   NAME                                                         ***)
  2521. (***                     INSERTSPACE                                ***)
  2522. (***                                                                ***)
  2523. (***   DESCRIPTION                                                  ***)
  2524. (***                                                                ***)
  2525. (***                THIS PROCEDURE WRITES A SINGLE SPACE ON THE     ***)
  2526. (***           OUTPUT FILE.  BEFORE RETURNING, IT PERFORMS SOME     ***)
  2527. (***           HOUSEKEEPING FUNCTIONS TO UPDATE THE CURRENT LINE    ***)
  2528. (***           POSITION INDICATOR OF THE OUTPUT FILE, AND TO        ***)
  2529. (***           ADJUST THE NUMBER OF SPACES TO BE PRINTED PRIOR      ***)
  2530. (***           TO THE OUTPUTTING OF THE CURRENT SYMBOL              ***)
  2531. (***                                                                ***)
  2532. (***   INPUTS                                                       ***)
  2533. (***           CURRLINEPOS---OF THE OUTPUT FILE                     ***)
  2534. (***           SYMBOL                                               ***)
  2535. (***                                                                ***)
  2536. (***                                                                ***)
  2537. (***   OUTPUTS                                                      ***)
  2538. (***           CURRLINEPOS                                          ***)
  2539. (***           SYMBOL                                               ***)
  2540. (***                                                                ***)
  2541. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2542. (***                   NONE                                         ***)
  2543. (***                                                                ***)
  2544. (***   REFERENCED BY                                                ***)
  2545. (***                   PRINTENDIDENTIFIER                           ***)
  2546. (***                                                                ***)
  2547. (**********************************************************************)
  2548. PROCEDURE INSERTSPACE( (* USING *)      VAR SYMBOL     : SYMBOLINFO
  2549.                        (* WRITING TO OUTPUT *)                      );
  2550. BEGIN (* INSERTSPACE *)
  2551.    IF CURRLINEPOS < MAXLINESIZE
  2552.       THEN
  2553.          BEGIN
  2554.             WRITE(SPACE);
  2555.             CURRLINEPOS := CURRLINEPOS + 1;
  2556.             WITH SYMBOL^ DO
  2557.                IF (CRSBEFORE = 0) AND (SPACESBEFORE > 0)
  2558.                   THEN
  2559.                      SPACESBEFORE := SPACESBEFORE - 1
  2560.          END
  2561. END; (* INSERTSPACE *)
  2562. (*=********************************************************************)
  2563. (**********************************************************************)
  2564. (***                                                                ***)
  2565. (***   NAME                                                         ***)
  2566. (***                 MOVELINEPOS                                    ***)
  2567. (***                                                                ***)
  2568. (***   DESCRIPTION                                                  ***)
  2569. (***                                                                ***)
  2570. (***              THIS PROCEDURE WRITES SPACES ON THE OUTPUT        ***)
  2571. (***          FILE FROM THE CURRENT LINE POSITION PLUS ONE TO       ***)
  2572. (***          NEW LINE POSITION.                                    ***)
  2573. (***                                                                ***)
  2574. (***                                                                ***)
  2575. (***                                                                ***)
  2576. (***   INPUTS                                                       ***)
  2577. (***          CURRLINEPOS--- OF THE OUTPUT FILE                     ***)
  2578. (***          NEWLINEPOS---- NEW POSITION REQUIRED                  ***)
  2579. (***                                                                ***)
  2580. (***   OUTPUTS                                                      ***)
  2581. (***          CURRLINEPOS--- SET EQUAL TO "NEWLINEPOS"              ***)
  2582. (***                                                                ***)
  2583. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2584. (***                  NONE                                          ***)
  2585. (***                                                                ***)
  2586. (***   REFERENCED BY                                                ***)
  2587. (***                  PPSYMBOL                                      ***)
  2588. (***                                                                ***)
  2589. (**********************************************************************)
  2590. PROCEDURE MOVELINEPOS( (* TO *)       NEWLINEPOS  : INTEGER;
  2591.                        (* FROM *) VAR CURRLINEPOS : INTEGER
  2592.                        (* WRITING TO OUTPUT *)              );
  2593. VAR
  2594.    I: INTEGER;
  2595. BEGIN (* MOVELINEPOS *)
  2596.    FOR I := CURRLINEPOS+1 TO NEWLINEPOS DO
  2597.       WRITE(SPACE);
  2598.    CURRLINEPOS := NEWLINEPOS
  2599. END; (* MOVELINEPOS *)
  2600. (*=********************************************************************)
  2601. (**********************************************************************)
  2602. (***                                                                ***)
  2603. (***   NAME                                                         ***)
  2604. (***                  PRINTSYMBOL                                   ***)
  2605. (***                                                                ***)
  2606. (***   DESCRIPTION                                                  ***)
  2607. (***                                                                ***)
  2608. (***              THIS PROCEDURE WRITES THE CURRENT SYMBOL TO       ***)
  2609. (***        THE OUTPUT FILES AND UPDATES THE CURRENT LINE POS-      ***)
  2610. (***        ITION PRIOR TO RETURNING.                               ***)
  2611. (***                                                                ***)
  2612. (***                                                                ***)
  2613. (***   INPUTS                                                       ***)
  2614. (***          CURRSYM -----OF THE INPUT FILE                        ***)
  2615. (***          CURRLINEPOS--OF THE OUTPUT FILE                       ***)
  2616. (***                                                                ***)
  2617. (***   OUTPUTS                                                      ***)
  2618. (***          CURRLINEPOS--UPDATED CURRENT LINE POSITION            ***)
  2619. (***          STARTPOS-----STARTING POSITION OF LAST SYMBOL WRITTEN ***)
  2620. (***                                                                ***)
  2621. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2622. (***                  NONE                                          ***)
  2623. (***                                                                ***)
  2624. (***   REFERENCED BY                                                ***)
  2625. (***                  PPSYMBOL                                      ***)
  2626. (***                                                                ***)
  2627. (**********************************************************************)
  2628. PROCEDURE PRINTSYMBOL( (* IN *)             CURRSYM     : SYMBOLINFO;
  2629.                        (* UPDATING *)   VAR CURRLINEPOS : INTEGER
  2630.                        (* WRITING TO OUTPUT *)                       );
  2631. VAR
  2632.    I: INTEGER;
  2633. BEGIN (* PRINTSYMBOL *)
  2634.    WITH CURRSYM^ DO
  2635.       BEGIN
  2636.          FOR I := 1 TO LENGTH DO
  2637.             WRITE(VALU[I]);
  2638.          STARTPOS := CURRLINEPOS; (* SAVE START POS FOR TAB PURPOSES *)
  2639.          CURRLINEPOS := CURRLINEPOS + LENGTH
  2640.       END (* WITH *)
  2641. END; (* PRINTSYMBOL *)
  2642. (*=********************************************************************)
  2643. (**********************************************************************)
  2644. (***                                                                ***)
  2645. (***   NAME                                                         ***)
  2646. (***                 PPSYMBOL                                       ***)
  2647. (***                                                                ***)
  2648. (***   DESCRIPTION                                                  ***)
  2649. (***                                                                ***)
  2650. (***             THIS PROCEDURE DETERMINES THE PROPER POSITION OF   ***)
  2651. (***          THE WRITE HEAD OF THE OUTPUT FILE ACCORDING TO THE    ***)
  2652. (***          VALUES OF "CURRLINEPOS", "CRSBEFORE", "SPACESBEFORE", ***)
  2653. (***          AND "LENGTH".  THE OUTPUT FILE IS POSITIONED TO THIS  ***)
  2654. (***          POSITION VIA CALLS  TO "PROCEDURE WRITECRS" AND "PRO  ***)
  2655. (***          CEDURE MOVELINEPOS" TO MOVE THE CURRENT LINE POSITION ***)
  2656. (***          TO THE NEW LINE POSITION.  THE CURRENT SYMBOL IS THEN ***)
  2657. (***          OUTPUTTED VIA A CALL TO "PROCEDURE PRINTSYMBOL".      ***)
  2658. (***                                                                ***)
  2659. (***   INPUTS                                                       ***)
  2660. (***          CURRLINEPOS---OF THE OUTPUT FILE                      ***)
  2661. (***          CURRSYM-------OF THE INPUT FILE                       ***)
  2662. (***          CURRMARGIN----CURRENT MARGIN FOR INDENTATION          ***)
  2663. (***          PARENINDENT---MARGIN FOR INDENTION FOR CERTAIN LISTS  ***)
  2664. (***                                                                ***)
  2665. (***   OUTPUTS                                                      ***)
  2666. (***          NEWLINEPOS----NEW POSITION THAT CURRENT LINE POSITION ***)
  2667. (***                        MUST BE RELOCATED TO BEFORE OUTPUTTING  ***)
  2668. (***                        THE CURRENT CYMBOL                      ***)
  2669. (***          CURRLINEPOS---UPDATED CURRENT LINE POSITION           ***)
  2670. (***                                                                ***)
  2671. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2672. (***                     WRITECRS                                   ***)
  2673. (***                     MOVELINEPOS                                ***)
  2674. (***                     PRINTSYMBOL                                ***)
  2675. (***                                                                ***)
  2676. (***   REFERENCED BY                                                ***)
  2677. (***                     GOBBLE                                     ***)
  2678. (***                     PRETTYPRINT                                ***)
  2679. (***                                                                ***)
  2680. (**********************************************************************)
  2681. PROCEDURE PPSYMBOL( (* IN *)             CURRSYM    : SYMBOLINFO
  2682.                     (* WRITING TO OUTPUT *)                      );
  2683. CONST
  2684.       ONCE  = 1;
  2685. VAR
  2686.     NEWLINEPOS: INTEGER;
  2687. BEGIN (* PPSYMBOL *)
  2688.    WITH CURRSYM^ DO
  2689.       BEGIN
  2690.          WRITECRS( (* USING *)      CRSBEFORE,
  2691.                    (* UPDATING *)   CURRLINEPOS
  2692.                    (* WRITING TO OUTPUT *)      );
  2693.          IF (CURRLINEPOS + SPACESBEFORE > CURRMARGIN)
  2694.             OR (NAME IN [ OPENCOMMENT ])
  2695.             THEN
  2696.                NEWLINEPOS := CURRLINEPOS + SPACESBEFORE
  2697.             ELSE
  2698.                IF (PARENCOUNTER > 0) AND
  2699.                   (NEXTSYM^.NAME <> OPENPAREN)
  2700.                   THEN
  2701.                      NEWLINEPOS := PARENINDENT
  2702.                   ELSE
  2703.                      NEWLINEPOS := CURRMARGIN;
  2704.          IF NEWLINEPOS + LENGTH > MAXLINESIZE
  2705.             THEN
  2706.                BEGIN
  2707.                   WRITECRS( ONCE, (* UPDATING *)   CURRLINEPOS
  2708.                                   (* WRITING TO OUTPUT *)       );
  2709.                   IF CURRMARGIN + LENGTH <= MAXLINESIZE
  2710.                      THEN
  2711.                         NEWLINEPOS := CURRMARGIN
  2712.                      ELSE
  2713.                         IF LENGTH < MAXLINESIZE
  2714.                            THEN
  2715.                               NEWLINEPOS := MAXLINESIZE - LENGTH
  2716.                            ELSE
  2717.                               NEWLINEPOS := 0
  2718.                END;
  2719.          MOVELINEPOS( (* TO *)    NEWLINEPOS,
  2720.                       (* FROM *)  CURRLINEPOS
  2721.                       (* IN OUTPUT *)        );
  2722.          PRINTSYMBOL( (* IN *)         CURRSYM,
  2723.                       (* UPDATING *)   CURRLINEPOS
  2724.                       (* WRITING TO OUTPUT *)      )
  2725.       END (* WITH *)
  2726. END; (* PPSYMBOL *)
  2727. (*=********************************************************************)
  2728. (**********************************************************************)
  2729. (***                                                                ***)
  2730. (***   NAME                                                         ***)
  2731. (***                GOBBLE                                          ***)
  2732. (***                                                                ***)
  2733. (***   DESCRIPTION                                                  ***)
  2734. (***                                                                ***)
  2735. (***               THIS PROCEDURE "GOBBLES" SYMBOLS FROM THE IN-    ***)
  2736. (***         PUT FILE AND OUTPUTS THEM ONTO THE OUTPUT FILE UNTIL   ***)
  2737. (***         A SYMBOL IS ENCOUNTERED WHICH IS ONE OF THE TERMIN-    ***)
  2738. (***         ATORS.                                                 ***)
  2739. (***                                                                ***)
  2740. (***   INPUTS                                                       ***)
  2741. (***         TERMINATORS---LIST OF SYMBOLS WHICH TERMINATE THE      ***)
  2742. (***                       "GOBBLE" MODE.                           ***)
  2743. (***         CURRSYM-------OF THE INPUT FILE                        ***)
  2744. (***         NEXTSYM-------OF THE INPUT FILE                        ***)
  2745. (***                                                                ***)
  2746. (***   OUTPUTS                                                      ***)
  2747. (***         CURRSYM-------UPDATED                                  ***)
  2748. (***         NEXTSYM-------UPDATED                                  ***)
  2749. (***                                                                ***)
  2750. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2751. (***                  GETSYMBOL                                     ***)
  2752. (***                  PPSYMBOL                                      ***)
  2753. (***                  LSHIFT                                        ***)
  2754. (***                                                                ***)
  2755. (***   REFERENCED BY                                                ***)
  2756. (***                  PRETTYPRINT                                   ***)
  2757. (***                                                                ***)
  2758. (**********************************************************************)
  2759. PROCEDURE GOBBLE( (* SYMBOLS FROM INPUT *)
  2760.                   (* UP TO *)            TERMINATORS : KEYSYMSET;
  2761.                   (* UPDATING *)     VAR CURRSYM,
  2762.                                          NEXTSYM     : SYMBOLINFO
  2763.                   (* WRITING TO OUTPUT *)                         );
  2764. BEGIN (* GOBBLE *)
  2765.    WHILE NOT(NEXTSYM^.NAME IN (TERMINATORS + [ENDOFFILE])) DO
  2766.       BEGIN
  2767.          GETSYMBOL( (* FROM INPUT *)
  2768.                     (* UPDATING *)  NEXTSYM,
  2769.                     (* RETURNING *) CURRSYM   );
  2770.          PPSYMBOL( (* IN *)         CURRSYM
  2771.                    (* WRITING TO OUTPUT *)   )
  2772.       END; (* WHILE *)
  2773. END; (* GOBBLE *)
  2774. (*=********************************************************************)
  2775. (**********************************************************************)
  2776. (***                                                                ***)
  2777. (***   NAME                                                         ***)
  2778. (***                    RSHIFT                                      ***)
  2779. (***                                                                ***)
  2780. (***   DESCRIPTION                                                  ***)
  2781. (***                                                                ***)
  2782. (***              THIS PROCEDURE INDENTS THE CURRENT MARGIN BY A    ***)
  2783. (***           AMOUNT.  THE PREVIOUS MARGIN IS SAVED BY BEING       ***)
  2784. (***           PUSHED ONTO A STACK FOR LATER RETREIVAL.             ***)
  2785. (***                                                                ***)
  2786. (***   INPUTS                                                       ***)
  2787. (***           ENDIDENTIFIER---RECORD CONTAINING A "END IDENT-      ***)
  2788. (***                           IFIER" NAME ,VALU AND LENGTH         ***)
  2789. (***           CURRMARGIN                                           ***)
  2790. (***           CURRSYM                                              ***)
  2791. (***           STARTPOS                                             ***)
  2792. (***                                                                ***)
  2793. (***   OUTPUTS                                                      ***)
  2794. (***           CURRMARGIN                                           ***)
  2795. (***                                                                ***)
  2796. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2797. (***                   STACKFULL                                    ***)
  2798. (***                   PUSHSTACK                                    ***)
  2799. (***                                                                ***)
  2800. (***   REFERENCED BY                                                ***)
  2801. (***                   PRETTYPRINT                                  ***)
  2802. (***                                                                ***)
  2803. (**********************************************************************)
  2804. PROCEDURE RSHIFT( (* USING *) CURRSYM : KEYSYMBOL );
  2805. BEGIN (* RSHIFT *)
  2806.    IF NOT STACKFULL
  2807.       THEN
  2808.          PUSHSTACK( (* USING *) CURRSYM,
  2809.                                 CURRMARGIN,
  2810.                                 ENDIDENTIFIER.ENDSYMBOL,
  2811.                                 ENDIDENTIFIER.LLENGTH );
  2812.    (* IF EXTRA INDENTATION WAS USED, UPDATE MARGIN. *)
  2813.    IF STARTPOS > CURRMARGIN
  2814.       THEN
  2815.          CURRMARGIN := STARTPOS;
  2816.    IF CURRMARGIN < SLOFAIL1
  2817.       THEN
  2818.          CURRMARGIN := CURRMARGIN + INDENT1
  2819.       ELSE
  2820.          IF CURRMARGIN < SLOFAIL2
  2821.             THEN
  2822.                CURRMARGIN := CURRMARGIN + INDENT2
  2823. END; (* RSHIFT *)
  2824. (*=********************************************************************)
  2825. (**********************************************************************)
  2826. (***                                                                ***)
  2827. (***   NAME                                                         ***)
  2828. (***               PRINTENDIDENTIFIER                               ***)
  2829. (***                                                                ***)
  2830. (***   DESCRIPTION                                                  ***)
  2831. (***         THIS PROCEDURE WRITE TO THE OUTPUT FILE AFTER THE      ***)
  2832. (***     KEYWORD "END" OF THE BLOCK WHICH IS TERMINATED.  BEFORE    ***)
  2833. (***     RETURNING, THE STARTING POSITION AND THE CURRENT LINE      ***)
  2834. (***     ARE UPDATED.                                               ***)
  2835. (***                                                                ***)
  2836. (***   INPUTS                                                       ***)
  2837. (***       CURRLINEPOS--OF THE OUTPUT FILE                          ***)
  2838. (***       ENDIDENTIFIER.LLENGTH--THE NUMBER OF CHARACTER IN THE    ***)
  2839. (***                              IDENTIFIER-NAME-STRING.           ***)
  2840. (***       ENDIDENTIFIER.ENDSYMBOL-- AN ARRAY CONTAINING THE CHAR-  ***)
  2841. (***                                 OF THE IDENTIFIER-NAME-STRING. ***)
  2842. (***                                                                ***)
  2843. (***   OUTPUTS                                                      ***)
  2844. (***       CURRLINEPOS--UDATED NEW LINE POSITION AFTER OUTPUTING.   ***)
  2845. (***       STARTPOS--STARTING POSITION OF LAST SYMBOL WRITTEN       ***)
  2846. (***                 PURPOSES.                                      ***)
  2847. (***       A ENDIDENTIFIER IS WRITTEN ON THE OUTPUT FILE            ***)
  2848. (***                                                                ***)
  2849. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2850. (***                   NONE                                         ***)
  2851. (***                                                                ***)
  2852. (***   REFERENCED BY                                                ***)
  2853. (***                   PRETTYPRINT                                  ***)
  2854. (***                                                                ***)
  2855. (**********************************************************************)
  2856.  PROCEDURE PRINTENDIDENTIFIER;
  2857.    VAR
  2858.       I:INTEGER;
  2859.    BEGIN
  2860.          WITH ENDIDENTIFIER DO
  2861.             BEGIN
  2862.                WRITE(SPACE);
  2863.                FOR I := 1 TO LLENGTH DO
  2864.                   WRITE(ENDSYMBOL[I]);
  2865.                STARTPOS := CURRLINEPOS;
  2866.                CURRLINEPOS := CURRLINEPOS + LLENGTH;
  2867.             END; (* WITH *);
  2868.    END;(* PRINTENDIDENTIFIER *)
  2869.  
  2870. (*=********************************************************************)
  2871. (**********************************************************************)
  2872. (***                          --  CAW  --                           ***)
  2873. (***                                                                ***)
  2874. (***   NAME                                                         ***)
  2875. (***               WHENANDENDFLAGS                                  ***)
  2876. (***                                                                ***)
  2877. (***   DESCRIPTION                                                  ***)
  2878. (***       THIS PROCEDURE IS USED TO KEEP TRACK OF THE INDENTATION  ***)
  2879. (***       OF THE CASE STATEMENTS, EXCEPTION HANDLERS, AND THE      ***)
  2880. (***       BEGIN/END BLOCK STATEMENTS.                              ***)
  2881. (***                                                                ***)
  2882. (***   INPUTS                                                       ***)
  2883. (***       CURRSYM-- THE CURRENT TOKEN THAT IS BEING PROCESSED.     ***)
  2884. (***                                                                ***)
  2885. (***   OUTPUTS                                                      ***)
  2886. (***          NONE                                                  ***)
  2887. (***                                                                ***)
  2888. (***   PROCEDURES/FUNCTIONS USED                                    ***)
  2889. (***                   NONE                                         ***)
  2890. (***                                                                ***)
  2891. (***   REFERENCED BY                                                ***)
  2892. (***                   PRETTYPRINT                                  ***)
  2893. (***                                                                ***)
  2894. (**********************************************************************)
  2895.  
  2896. PROCEDURE WHENANDENDFLAGS(CURRSYM : SYMBOLINFO);
  2897.   VAR
  2898.      INDEX : INTEGER;
  2899.      TEMP  : STRING;
  2900.  
  2901.   BEGIN
  2902.  
  2903.     CASE CURRSYM^.NAME OF
  2904.       WHENSYM      :  IF WHEN_FLAG > 0 
  2905.                        THEN BEGIN
  2906.                          WHEN_FLAG := WHEN_FLAG - 1;
  2907.                          FOR INDEX:=1 TO 3 DO
  2908.                            INSERTSPACE(CURRSYM);
  2909.                        END
  2910.                        ELSE
  2911.                           LSHIFT;
  2912.       EXCEPTIONSYM :  BEGIN
  2913.                         WHEN_FLAG := WHEN_FLAG +  1;
  2914.                         IF SPECIAL_BEGIN[SPECIAL_INDEX] 
  2915.                           THEN BEGIN
  2916.                             EXCEPTION_FLAG[SPECIAL_INDEX] := TRUE;
  2917.                             CASE_FLAG[SPECIAL_INDEX] := FALSE;
  2918.                           END
  2919.                           ELSE BEGIN
  2920.                             SPECIAL_INDEX := SPECIAL_INDEX + 1;
  2921.                             EXCEPTION_FLAG[SPECIAL_INDEX] := TRUE;
  2922.                             CASE_FLAG[SPECIAL_INDEX] := FALSE;
  2923.                             SPECIAL_BEGIN[SPECIAL_INDEX] := FALSE;
  2924.                           END;
  2925.                       END;
  2926.       CASESYM      :  BEGIN
  2927.                         WHEN_FLAG := WHEN_FLAG + 1;
  2928.                         SPECIAL_INDEX := SPECIAL_INDEX + 1;
  2929.                         CASE_FLAG[SPECIAL_INDEX] := TRUE;
  2930.                         EXCEPTION_FLAG[SPECIAL_INDEX] := FALSE;
  2931.                         SPECIAL_BEGIN[SPECIAL_INDEX] := FALSE;
  2932.                       END;
  2933.       BEGINSYM     :  BEGIN
  2934.                         IF BEGIN_FLAG 
  2935.                           THEN BEGIN
  2936.                             PUSHSTACK(CURRSYM^.NAME,CURRMARGIN,TEMP,0);
  2937.                           END;
  2938.                         IF (CASE_FLAG[SPECIAL_INDEX]) OR 
  2939.                         (EXCEPTION_FLAG[SPECIAL_INDEX]) OR
  2940.                         (SPECIAL_BEGIN[SPECIAL_INDEX])
  2941.                           THEN BEGIN
  2942.                             SPECIAL_INDEX := SPECIAL_INDEX + 1;
  2943.                             SPECIAL_BEGIN[SPECIAL_INDEX] := TRUE;
  2944.                             EXCEPTION_FLAG[SPECIAL_INDEX] := FALSE;
  2945.                             CASE_FLAG[SPECIAL_INDEX] := FALSE;
  2946.                           END;
  2947.                       END;
  2948.       ENDSYM       :  BEGIN
  2949.                         IF (CASE_FLAG[SPECIAL_INDEX]) 
  2950.                           THEN BEGIN
  2951.                                  CASE_FLAG[SPECIAL_INDEX] := FALSE;
  2952.                                  SPECIAL_INDEX := SPECIAL_INDEX - 1;
  2953.                                  LSHIFT;
  2954.                           END
  2955.                           ELSE IF (EXCEPTION_FLAG[SPECIAL_INDEX])
  2956.                             THEN BEGIN
  2957.                               EXCEPTION_FLAG[SPECIAL_INDEX] := FALSE;
  2958.                               SPECIAL_INDEX := SPECIAL_INDEX - 1;
  2959.                               LSHIFT;
  2960.                               LSHIFT;
  2961.                             END
  2962.                             ELSE IF SPECIAL_BEGIN[SPECIAL_INDEX] 
  2963.                               THEN BEGIN
  2964.                                 SPECIAL_BEGIN[SPECIAL_INDEX] := FALSE;
  2965.                                 SPECIAL_INDEX := SPECIAL_INDEX - 1;
  2966.                               END;
  2967.                        END;
  2968.     END;
  2969.   END;   
  2970.  
  2971.  
  2972. BEGIN (* PRETTYPRINT *)
  2973.    INITIALIZE;
  2974.    WHILE (NEXTSYM^.NAME <> ENDOFFILE) DO
  2975.       BEGIN
  2976.          GETSYMBOL( (* FROM INPUT *)
  2977.                     (* UPDATING *)  NEXTSYM,
  2978.                     (* RETURNING *) CURRSYM   );
  2979.  
  2980. (*                 CAW              *)
  2981.  
  2982.          IF ((CURRSYM^.NAME = SPECIALISSYM)
  2983.             AND ((NEXTSYM^.NAME = PRIVATESYM) OR 
  2984.             (NEXTSYM^.NAME = LIMITEDSYM)))
  2985.             THEN CURRSYM^.NAME := ISSYM;
  2986.  
  2987.          SPECIAL_FLAG := FALSE;
  2988.  
  2989.          IF ((CURRSYM^.NAME = PACKAGESYM) AND (NEXTSYM^.NAME <> BODYSYM))
  2990.          OR ((CURRSYM^.NAME = PROCSYM) AND (NEXTSYM^.NAME <> BODYSYM))
  2991.             THEN BEGIN
  2992.     
  2993.                    INSERTBLANKLINE(CURRSYM);
  2994.                    PPSYMBOL(CURRSYM);
  2995.                    SPECIAL_FLAG := TRUE;
  2996.                    CRPENDING := FALSE;
  2997.                    GETSYMBOL (NEXTSYM,CURRSYM);
  2998.                    PPSYMBOL(CURRSYM);
  2999.                    GETSYMBOL (NEXTSYM,CURRSYM);
  3000.                    IF NEXTSYM^.NAME = NEWSYM
  3001.                      THEN CURRSYM^.NAME := SPECIALPKSYM
  3002.  
  3003.                  END;
  3004.  
  3005.  
  3006.          IF ((CURRSYM^.NAME = WITHSYM) AND ((NEXTSYM^.NAME = FUNCSYM)
  3007.          OR (NEXTSYM^.NAME = PROCSYM)))
  3008.             THEN CURRSYM^.NAME := SPECIALWTH;
  3009.  
  3010.  
  3011.  (*    END    CAW   *)
  3012.  
  3013.  
  3014.  
  3015.  
  3016.          WITH PPOPTION [CURRSYM^.NAME] DO
  3017.             BEGIN
  3018.  
  3019. (***       CAW     ***)
  3020.  
  3021.                IF CURRSYM^.NAME IN [LOOPSYM, SPECIALLOOPSYM, IFSYM,
  3022.                                     BEGINSYM]
  3023.                   THEN BEGIN
  3024.                     FIRST_BEGIN := TRUE;
  3025.                     NUM_BEGINS := NUM_BEGINS + 1;
  3026.                   END;
  3027.                IF ((CURRSYM^.NAME = ENDSYM) AND (FIRST_BEGIN)) 
  3028.                   THEN IF NUM_BEGINS > 0 THEN NUM_BEGINS := NUM_BEGINS - 1;
  3029.  
  3030.  
  3031.                IF CURRSYM^.NAME IN [WHENSYM, EXCEPTIONSYM,
  3032.                CASESYM, BEGINSYM, ENDSYM ]
  3033.                   THEN
  3034.                     WHENANDENDFLAGS(CURRSYM);
  3035.  
  3036. (***  END   CAW  ***)
  3037.  
  3038.  
  3039.                IF (CRPENDING AND NOT(CRSUPPRESS IN OPTIONSSELECTED))
  3040.                  OR (CRBEFORE IN OPTIONSSELECTED)
  3041.                   THEN
  3042.                      BEGIN
  3043.                         INSERTCR( (* USING *)      CURRSYM
  3044.                                   (* WRITING TO OUTPUT *)  );
  3045.                         CRPENDING := FALSE
  3046.                      END;
  3047.                IF ((BLANKLINEBEFORE IN OPTIONSSELECTED) AND NOT
  3048.                   (SPECIAL_FLAG))
  3049.                   THEN
  3050.                      BEGIN
  3051.                         INSERTBLANKLINE( (* USING *)      CURRSYM
  3052.                                          (* WRITING TO OUTPUT *)  );
  3053.                         CRPENDING := FALSE
  3054.                      END;
  3055.                IF DINDENT IN OPTIONSSELECTED
  3056.                   THEN BEGIN
  3057.                      LSHIFT;
  3058.                      IF (PRIVATE_FLAG) AND (CURRSYM^.NAME = ENDSYM)  (*CAW*) 
  3059.                      AND (NOT(RECORD_FLAG)) AND (NOT(P_CASE_FLAG))   (*CAW*)
  3060.                        THEN BEGIN                                    (*CAW*)
  3061.                          CURRMARGIN := CURRMARGIN - 3;               (*CAW*)
  3062.                          PRIVATE_FLAG := FALSE;                      (*CAW*)
  3063.                        END;                                          (*CAW*)
  3064.                   END;                        
  3065.  
  3066.                IF SPACEBEFORE IN OPTIONSSELECTED
  3067.                   THEN
  3068.                      INSERTSPACE( (* USING *)      CURRSYM
  3069.                                   (* WRITING TO OUTPUT *)   );
  3070.  
  3071.                PPSYMBOL( (* IN *)         CURRSYM
  3072.                          (* WRITING TO OUTPUT *)   );
  3073.  
  3074.  
  3075. (*******    CAW    *********)
  3076.  
  3077.  
  3078.                IF (CURRSYM^.NAME = CASESYM) AND (PRIVATE_FLAG)
  3079.                  THEN P_CASE_FLAG := TRUE;
  3080.  
  3081.                IF (CURRSYM^.NAME = ENDSYM) AND (P_CASE_FLAG)
  3082.                  THEN P_CASE_FLAG := FALSE;
  3083.  
  3084.                IF (CURRSYM^.NAME = RECORDSYM) AND (PRIVATE_FLAG)
  3085.                  THEN RECORD_FLAG := TRUE;
  3086.  
  3087.                IF (CURRSYM^.NAME = ENDSYM) AND (RECORD_FLAG)
  3088.                  THEN RECORD_FLAG := FALSE;
  3089.  
  3090.                IF CRSAFTER > 1 
  3091.                   THEN WRITECRS((CRSAFTER - 1),CURRLINEPOS);
  3092.  
  3093. (*********   END      CAW    **********)        
  3094.  
  3095.  
  3096.  
  3097.                IF SPACEAFTER IN OPTIONSSELECTED
  3098.                   THEN
  3099.                      INSERTSPACE( (* USING *)      NEXTSYM
  3100.                                   (* WRITING TO OUTPUT *)    );
  3101.                IF CURRSYM^.NAME = ENDSYM
  3102.                   THEN IF NEXTSYM^.NAME = SEMICOLON
  3103.                           THEN
  3104.                              PRINTENDIDENTIFIER;
  3105.                IF INDENTBYTAB IN OPTIONSSELECTED
  3106.                   THEN
  3107.                      RSHIFT( (* USING *) CURRSYM^.NAME );
  3108.               
  3109.  
  3110.                IF GOBBLESYMBOLS IN OPTIONSSELECTED
  3111.                   THEN
  3112.                      GOBBLE( (* SYMBOLS FROM INPUT *)
  3113.                              (* UP TO *)        GOBBLETERMINATORS,
  3114.                              (* UPDATING *)     CURRSYM,
  3115.                                                 NEXTSYM
  3116.                              (* WRITING TO OUTPUT *)                 );
  3117.                IF INDENTMARGIN IN OPTIONSSELECTED
  3118.                   THEN
  3119.                     BEGIN
  3120.                       IF NOT STACKFULL
  3121.                          THEN
  3122.                             PUSHSTACK(CURRSYM^.NAME,
  3123.                                       CURRMARGIN,
  3124.                                       ENDIDENTIFIER.ENDSYMBOL,
  3125.                                       ENDIDENTIFIER.LLENGTH );
  3126.                       IF CURRMARGIN < SLOFAIL1
  3127.                          THEN
  3128.                             CURRMARGIN := CURRMARGIN + INDENT1
  3129.                          ELSE
  3130.                             IF CURRMARGIN < SLOFAIL2
  3131.                                THEN
  3132.                                   CURRMARGIN:=CURRMARGIN+INDENT2
  3133.                    END;
  3134.                IF CRAFTER IN OPTIONSSELECTED
  3135.                   THEN
  3136.                      CRPENDING := TRUE;
  3137.  
  3138.  
  3139. (********* CAW **********)
  3140.  
  3141.                IF ((FIRST_BEGIN) AND (NUM_BEGINS = 0) AND 
  3142.                (NEXTSYM^.NAME = BEGINSYM)) THEN 
  3143.                    LSHIFT;
  3144.  
  3145.                IF CURRSYM^.NAME = PRIVATESYM 
  3146.                   THEN PRIVATE_FLAG := TRUE;
  3147.  
  3148.                IF CURRSYM^.NAME = BEGINSYM 
  3149.                   THEN BEGIN_FLAG := TRUE;
  3150.  
  3151. (******** END    CAW ********)
  3152.  
  3153.  
  3154.             END (* WITH *)
  3155.       END; (* WHILE *)
  3156.    IF CRPENDING
  3157.       THEN
  3158.          WRITELN
  3159. END.
  3160.