(* PROGRAM TITLE: PASCAL PRETTYPRINTING PROGRAM AUTHORS: JON F. HUERAS AND HENRY F. LEDGARD COMPUTER AND INFORMATION SCIENCE DEPARTMENT UNIVERSITY OF MASSACHUSETTS, AMHERST (EARLIER VERSIONS AND CONTRIBUTIONS BY RANDY CHOW AND JOHN GORMAN.) BUGS CORRECTED BY : CHARLES FISCHER DEPARTMENT OF COMPUTER SCIENCE UNIVERSITY OF WISCONSIN, MADISON 1977 MODIFICATIONS : ( FOR GEORGIA TECH CYBER 70 (1979)) PETER N. WAN INFORMATION AND COMPUTER SCIENCE GEORGIA INSTITUTE OF TECHNOLOGY ATLANTA, GEORGIA 30332 ( FOR UCSD PASCAL V1.5 (1979) ) FRANCIS J. MONACO 2679 LOWELL DRIVE MARIETTA, GEORGIA 30060 404-424-1460 SPECIAL NOTE ON CURRENT VERSION: THE PROGRAM CURRENTLY RUNS UNDER UCSD PASCAL; THE MODIFICATIONS TO THE BELOW PROGRAM SUMMARY INCLUDE: 1) PROGRAM PROMPTS FOR DISK FILE IN LOGICAL UNIT #5; USER SHOULD RESPOND WITH FIRST PART OF FILE NAME ( TO BE PRETTYPRINTED ) AS --> MYPROG----- NOT #5:MYPROG.TEXT !!! 2) PROGRAM PROMPTS FOR DISK FILE FOR PRETTYPRINTED PGM; AGAIN, USER SHOULD RESPOND WITH FIRST PART OF FILE NAME ONLY. 3) PROGRAM NOW ACCEPTS UPPER/LOWER CASE INPUT AND TRANSLITERATES ALL TO UPPER CASE ( TO EASE PORTABILITY CONSIDERATIONS ). NOTE: QUOTED STRINGS ARE NOT TRANSLITERATED; ALSO, PROGRAM CONVERTS '{' TO '(*' AND '}' TO '*)' FOR COMMENTS. 4) PROGRAM BUILDS PRETTYPRINTED DISK FILE WHILE SIMULTANEOUSLY ECHOING OUTPUT TO CRT ( IN REAL TIME ). 5) PROGRAM WILL LEAVE UCSD SPECIAL RESERVED WORDS LIKE "SEGMENT", "UNIT", ETC. ALONE. 6) PRETTYPRINTED OUTPUT IS 79 CHARACTERS PER LINE (SEE MAXLINESIZE) PROGRAM SUMMARY: THIS PROGRAM TAKES AS INPUT A PASCAL PROGRAM AND REFORMATS THE PROGRAM ACCORDING TO A STANDARD SET OF PRETTYPRINTING RULES. THE PRETTYPRINTED PROGRAM IS GIVEN AS OUTPUT. THE PRETTYPRINTING RULES ARE GIVEN BELOW. AN IMPORTANT FEATURE IS THE PROVISION FOR THE USE OF EXTRA SPACES AND EXTRA BLANK LINES. THEY MAY BE FREELY INSERTED BY THE USER IN ADDITION TO THE SPACES AND BLANK LINES INSERTED BY THE PRETTYPRINTER. NO ATTEMPT IS MADE TO DETECT OR CORRECT SYNTACTIC ERRORS IN THE USER'S PROGRAM. HOWEVER, SYNTACTIC ERRORS MAY RESULT IN ERRONEOUS PRETTYPRINTING. INPUT FILE: (PROMPTED) - A FILE OF CHARACTERS, PRESUMABLY A PASCAL PROGRAM OR PROGRAM FRAGMENT. OUTPUT FILES: (PROMPTED) - THE PRETTYPRINTED PROGRAM. PASCAL PRETTYPRINTING RULES. .[ GENERAL PRETTYPRINTING RULES ] 1. ANY SPACES OR BLANK LINES BEYOND THOSE GENERATED BY THE PRETTYPRINTER ARE LEFT ALONE. THE USER IS ENCOURAGED, FOR THE SAKE OF READABILITY, TO MAKE USE OF THIS FACILITY. IN ADDITION, COMMENTS ARE LEFT WHERE THEY ARE FOUND, UNLESS THEY ARE SHIFTED RIGHT BY PRECEEDING TEXT ON A LINE. 2. ALL STATEMENTS AND DECLARATIONS BEGIN ON SEPARATE LINES. 3. NO LINE MAY BE GREATER THAN 72 CHARACTERS LONG. ANY LINE LONGER THAN THIS IS CONTINUED ON A SEPARATE LINE. 4. THE KEYWORDS "BEGIN", "END", "REPEAT", AND "RECORD" ARE FORCED TO STAND ON LINES BY THEMSELVES (OR POSSIBLY FOLLWED BY SUPPORTING COMMENTS). IN ADDITION, THE "UNTIL" CLAUSE OF A "REPEAT-UNTIL" STATE- MENT IS FORCED TO START ON A NEW LINE. 5. A BLANK LINE IS FORCED BEFORE THE KEYWORDS "PROGRAM", "PROCEDURE", "FUNCTION", "LABEL", "CONST", "TYPE", AND "VAR". 6. A SPACE IS FORCED BEFORE AND AFTER THE SYMBOLS ":" AND "". ADDITIONALLY, A SPACE IS FORCED AFTER THE SYMBOL ":". NOTE THAT ONLY ""S IN DECLARATIONS ARE FORMATTED. ""S IN EXPRESSIONS ARE IGNORED. [ INDENTATION RULES ] 1. THE BODIES OF "LABEL", "CONST", "TYPE", AND "VAR" DECLARA- TIONS ARE INDENTED FROM THEIR CORRESPONDING DECLARATION HEADER KEYWORDS. 2. THE BODIES OF "BEGIN-END", "REPEAT-UNTIL", "FOR", "WHILE", "WITH", AND "CASE" STATEMENTS, AS WELL AS "RECORD-END" STRUC- TURES AND "CASE" VARIANTS (TO ONE LEVEL) ARE INDENTED FROM THEIR HEADER KEYWORDS. 3. AN "IF-THEN-ELSE" STATEMENT IS INDENTED AS FOLLOWS: IF THEN ELSE GENERAL ALGORITHM THE STRATEGY OF THE PRETTYPRINTER IS TO SCAN SYMBOLS FROM THE INPUT PROGRAM AND MAP EACH SYMBOL INTO A PRETTYPRINTING ACTION, INDEPENDENTLY OF THE CONTEXT IN WHICH THE SYMBOL APPEARS. THIS IS ACCOMPLISHED BY A TABLE OF PRETTYPRINTING OPTIONS. FOR EACH DISTINGUISHED SYMBOL IN THE TABLE, THERE IS AN ASSOCIATED SET OF OPTIONS. IF THE OPTION HAS BEEN SELECTED FOR THE SYMBOL BEING SCANNED, THEN THE ACTION CORRESPONDING WITH EACH OPTION IS PERFORMED. THE BASIC ACTIONS INVOLVED IN PRETTYPRINTING ARE THE INDENT- ATION AND DE-INDENTATION OF THE MARGIN. EACH TIME THE MARGIN IS INDENTED, THE PREVIOUS VALUE OF THE MARGIN IS PUSHED ONTO A STACK, ALONG WITH THE NAME OF THE SYMBOL THAT CAUSED IT TO BE INDENTED. EACH TIME THE MARGIN IS DE-INDENTED, THE STACK IS POPPED OFF TO OBTAIN THE PREVIOUS VALUE OF THE MARGIN. THE PRETTYPRINTING OPTIONS ARE PROCESSED IN THE FOLLOWING ORDER, AND INVOKE THE FOLLOWING ACTIONS: CRSUPPRESS - IF A CARRIAGE RETURN HAS BEEN INSERTED FOLLOWING THE PREVIOUS SYMBOL, THEN IT IS INHIBITED UNTIL THE NEXT SYMBOL IS PRINTED. CRBEFORE - A CARRIAGE RETURN IS INSERTED BEFORE THE CURRENT SYMBOL (UNLESS ONE IS ALREADY THERE) BLANKLINEBEFORE - A BLANK LINE IS INSERTED BEFORE THE CURRENT SYMBOL (UNLESS ALREADY THERE). DINDENTONKEYS - IF ANY OF THE SPECIFIED KEYS ARE ON TOP OF OF THE STACK, THE STACK IS POPPED, DE-INDEN- TING THE MARGIN. THE PROCESS IS REPEATED UNTIL THE TOP OF THE STACK IS NOT ONE OF THE SPECIFIED KEYS. DINDENT - THE STACK IS UNCONDITIONALLY POPPED AND THE MARGIN IS DE-INDENTED. SPACEBEFORE - A SPACE IS INSERTED BEFORE THE SYMBOL BEING SCANNED (UNLESS ALREADY THERE). [ THE SYMBOL IS PRINTED AT THIS POINT ] SPACEAFTER - A SPACE IS INSERTED AFTER THE SYMBOL BEING SCANNED (UNLESS ALREADY THERE). GOBBLESYMBOLS - SYMBOLS ARE CONTINUOUSLY SCANNED AND PRINTED WITHOUT ANY PROCESSING UNTIL ONE OF THE SPECIFIED SYMBOLS IS SEEN (BUT NOT GOBBLED). INDENTBYTAB - THE MARGIN IS INDENTED BY A STANDARD AMOUNT FROM THE PREVIOUS MARGIN. INDENTTOCLP - THE MARGIN IS INDENTED TO THE CURRENT LINE POSITION. CRAFTER - A CARRIAGE RETURN IS INSERTED FOLLOWING THE SYMBOL SCANNED. *) (*Monaco's PASCAL PRETTYPRINTER for UCSD PASCAL 1) To learn how to use the Prettyprinter, see "PRETTY.DOC" 2) Make certain that program to be prettyprinted is in logical unit #5. 3) If you modify the source (PARTA, PARTB, PARTC), you must recompile PRETTY; note that the $I files are supposed to be on number 5. 4) Object file "PRETTY" should execute on your system as is: no terminal dependent software is used. 5) The author has found that the prettyprinter works best if the input to it is left-justified (no leading blanks on any line). I suggest that you write your PASCAL Program with indentations; then use "REM.BLANKS.CODE" to get rid of leading blanks and build a file to be input to the Prettyprinter. "REM.BLANKS.CODE" expects complete file specifications less ".text" such as #5:myprog. 6) Lastly, the purpose of prettyprinting is to standardize format for PASCAL programs to facilitate portability and to increase user familiarity with the suggested format of Jensen and Wirth. To this end, all programs that you expect to pass on should be prettyprinted! (NOTE: The prettyprinter is living proof of this itself). Note: To this end, the prettyprinter transliterates all lowercase characters not in quoted strings to uppercase and converts all brackets to (**). ( You can use a single ' inside of a comment ) *) .