Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-02 - decus/20-0068/imp.rno
There are 2 other files named imp.rno in the archive. Click here to see a list.
.RIGHT MARGIN 80
.SPACING 1
.NUMBER 1
.TITLE ^^IMP72 REFERENCE MANUAL\\
.JUSTIFY
.NOFILL
.SKIP 5
.CENTER
^^PDP-10 IMP72 REFERENCE MANUAL\\
.SKIP
.CENTER
^AUGUST 1973
.SKIP
.CENTER
^^IMP72 V\\ERSION 1.5
.PAGE
.SKIP 5
.CENTER
^C^O^N^T^E^N^T^S
.SKIP 2
.SKIP
1:      ^INTRODUCTION.
1.1:      ^DESCRIPTION.
1.2:      ^STATUS.
1.3:      ^HOW TO ^USE ^I^M^P IN ^ONE ^EASY ^LESSON.
1.4:      ^DIFFERENCES BETWEEN ^I^M^P72 AND THE ^PREVIOUS ^P^D^P-10 ^I^M^P.
1.5:      ^I^M^P72 ON ^T^E^N^E^X.
.SKIP
2:      ^PROGRAMMER'S ^GUIDE TO ^I^M^P72
.SKIP
2.1:      ^CONVENTIONS.
2.1.1:      ^LEXICAL.
2.1.2:      ^EXPRESSIONS AND ^STATEMENTS.
2.1.3:      ^MACHINE ^LANGUAGE ^LEVEL ^PROGRAMMING.
2.1.4:      ^PROGRAM ^STRUCTURE AND ^SCOPE OF ^VARIABLES.
2.1.5:      ^COMPILER ^VERSION ^NUMBER ^CONVENTIONS.
.SKIP
2.2:      ^THE ^EXPRESSIONS
2.2.1:      ^VARIABLES AND ^CONSTANTS
2.2.2:      ^UNARY ^OPERATORS AND ^FUNCTIONS.
2.2.3:      ^BINARY ^OPERATORS.
2.2.4:      ^CONTROL ^EXPRESSIONS.
2.2.5:      ^PROGRAMS, ^SUBPROGRAMS AND ^SUBPROGRAM ^CALLS.
2.2.6:      ^BYTE ^ACCESS.
2.2.7:      ^INPUT/^OUTPUT.
2.2.8:      ^DECLARATIONS; ^D^A^T^A AND ^R^E^M^O^T^E STATEMENTS.
2.2.9:      ^MISCELLANEOUS ^CONSTRUCTS.
.SKIP
2.3:      ^SYNTACTIC AND ^SEMANTIC ^EXTENSION.
2.3.1:      ^THE ^EASY ^WAY - ^SYNTACTIC "^MACROS"
2.3.2:      ^SPECIFYING ^SYNTAX.
2.3.3:      ^SPECIFYING ^SEMANTICS.
2.3.3.1:      ^SEMANTIC ^ROUTINES.
2.3.3.1.1:      ^CALLING ^CONVENTIONS FOR ^SEMANTIC ^ROUTINES.
2.3.3.1.2:      ^TABLE OF ^SEMANTIC ^ROUTINES
2.3.3.2:      ^CONDITIONAL ^SEMANTICS.
2.3.3.3:      ^C^A^S^ES.
2.3.3.4:      ^THE ^V^A^L^U^E ^KLUDGE.
2.3.3.5:      ^PRIORITY ^SEMANTICS.
2.3.4:      ^SYNTACTIC ^AMBIGUITY AND ^HOW TO ^MAKE IT ^WORK FOR ^YOU.
2.3.5:      ^PEACEFUL ^CO-^EXISTENCE WITH ^YOUR ^EXTENSIBLE ^COMPILER.
.SKIP
3:      ^HOW TO ^COMPILE AND ^RUN ^I^M^P72 ^PROGRAMS.
.SKIP
3.1:      ^COMPILING ^PROGRAMS.
3.1.1:      ^THE ^COMPILER ^LISTING.
3.2:      ^COMPILATION ^ERROR ^DIAGNOSTICS.
3.3:      ^LOADING AND ^RUNNING.
3.4:      ^MAKING A ^NEW ^COMPILER.
.SKIP
4:      ^INTERNAL ^DOCUMENTATION OF THE ^I^M^P72 ^COMPILER.
4.1:      ^PARSING.
4.2:      ^SEMANTICS.
4.3:      ^SEMANTICS AND ^CODE ^GENERATION.
4.4:      ^HOW ^EXTENSIBILITY IS ^IMPLEMENTED.
.SKIP
5:      ^DISTRIBUTION ^PROCEEDURE FOR ^I^M^P72.
.SKIP
        ^APPENDIX ^I: ^LIBRARY ^UTILITY ^ROUTINES
.SKIP
        ^APPENDIX ^I^I: ^SYNTAX OF ^^IMP72\\.
.SKIP
        ^REFERENCES.
.SKIP 10
.RIGHT MARGIN 60
.FILL
^THE ^I^M^P72 COMPILER WAS DESIGNED AND IMPLEMENTED AT THE ^YALE
^UNIVERSITY ^DEPARTMENT OF ^COMPUTER ^SCIENCE BY ^WALT ^BILOFSKY(*),
.FOOTNOTE 5
------------
.LEFT MARGIN 5
.INDENT -5
(*) ^PRESENT ADDRESS: ^BOLT ^BERANEK AND ^NEWMAN ^INC.,
50 ^MOULTON ^STREET, ^CAMBRIDGE, ^MASS. 02138.
!
^INSTITUTE FOR ^DEFENSE ^ANALYSES, ^PRINCETON, ^N.^J., BASED LARGELY
ON PREVIOUS WORK OF ^E. ^T. ^IRONS.  ^SUBSTANTIAL
CONTRIBUTIONS WERE MADE BY ^STEVEN ^WEINGART AND ^TERRY ^LYONS.
^THIS MANUAL REFLECTS VERSION 1.5 OF THE ^I^M^P72 COMPILER,
WHICH WAS WRITTEN TO RUN UNDER VERSION 5.06 OF THE
^^DEC\\SYSTEM-10 OPERATING SYSTEM,
AND WHICH HAS BEEN SUCCESSFULLY RUN UNDER VERSION 1.31.23 OF ^^TENEX\\.

.SUBTITLE 1: ^INTRODUCTION.
.PAGE
.RIGHT MARGIN 60
.SKIP 3
.NOFILL
.LEFT MARGIN 10
IMP (VT): ... (ARCHAIC) TO EKE OUT, STRENGTHEN.
IMP (N): ... (ARCHAIC) AN EVIL CREATURE.
                    [^WEBSTER'S 1967]
.SKIP
.LEFT MARGIN 0
.CENTER
"^THINGS USED AS LANGUAGE ARE INEXHAUSTIBLY ATTRACTIVE."
.CENTER
               [^EMERSON 1849]
.SKIP
.CENTER
" ... ^THE RED PLAGUE RID YOU,
.CENTER
^FOR LEARNING ME YOUR LANGUAGE!"
.CENTER
                   [^SHAKESPEARE 1612]
.FILL
.SKIP 3
.CENTER
^&1: ^INTRODUCTION.\&
.SKIP 3
.SUBTITLE 1.1:  ^DESCRIPTION.
.CENTER
^&1.1:  ^DESCRIPTION.\&
.PARAGRAPH
^I^M^P IS A SIMPLE HIGHER-LEVEL LANGUAGE INTENDED PRIMARILY FOR SYSTEM
PROGRAMMING.  ^IT HAS BEEN IMPLEMENTED ON THE ^P^D^P-10 AND ^C^D^C 1604 AND 6600
COMPUTERS [^IRONS 1970], [^BILOFSKY 1972].  ^IT IS MEANT
TO PROVIDE LANGUAGE FACILITIES ROUGHLY AT THE LEVEL OF ^F^O^R^T^R^A^N
^I^I YET ALLOW THE PROGRAMMER THE FLEXIBILITY OF MACHINE
LANGUAGE PROGRAMMING INCLUDING USE OF ALL THE MACHINE'S REGISTERS AND
INSTRUCTIONS AND ARBITRARY CONTROL OF THE PROGRAM AND DATA AREAS
WHILE THE PROGRAM IS RUNNING.  ^I^M^P72 IS A VERSION OF ^I^M^P FOR THE ^P^D^P-10
WHICH PROVIDES THE USER WITH THE FOLLOWING FACILITIES:
.SKIP
.LEFT MARGIN 10
.INDENT -3
1. ^EXTENSIBILITY.  ^THE USER MAY SPECIFY EXTENSIONS TO
THE SYNTAX AND SEMANTICS OF THE LANGUAGE IN FORMS RANGING FROM
SIMPLE "MACROS" TO PRODUCTIONS WHICH GENERATE CALLS TO COMPILER
CODE-GENERATING ROUTINES.  ^MORE EFFICIENT OBJECT CODE MAY EASILY BE
SPECIFIED FOR SPECIAL CASES.
.SKIP
.INDENT -3
2. ^FLOATING POINT CAPABILITIES.  ^A ^R^E^A^L DATA TYPE AND FLOATING POINT
ARITHMETIC ARE PROVIDED.
.SKIP
.INDENT -3
3. ^BYTE MANIPULATION CAPABILITY.
.SKIP
.INDENT -3
4. ^NO RESERVED WORDS IN THE SYNTAX.
.SKIP
.INDENT -3
5. ^SYNTACTIC ERROR CORRECTION AND ADMISSIBILITY OF AMBIGUOUS SYNTAX.
.SUBTITLE 1.2: ^STATUS.
.TEST PAGE 9
.SKIP 4
.LEFT MARGIN 0
.CENTER
^&1.2: ^STATUS.\&
.SKIP
.PARAGRAPH
^AS OF ^JUNE 1973, THE COMPILER HAS BEEN IN USE AT THE ^YALE ^DEPARTMENT
OF ^COMPUTER ^SCIENCE FOR A FULL ACADEMIC YEAR.  ^IT COMPILES ITSELF.
^A VERSION OF THE COMPILER WHICH GENERATES OBJECT CODE FOR THE ^P^D^P-11
.INDEX ^^PDP-11 IMP\\
.INDEX SIZE OF COMPILER
.INDEX COMPILATION SPEED
COMPUTER EXISTS AT ^YALE.  ^THE ^P^D^P-10 COMPILER IS
RELATIVELY LARGE (37^K MINIMUM, WITH UP TO ABOUT 50^K NEEDED TO COMPILE ITSELF)
AND NOT PARTICULARLY FAST (COMPILES AT THE RATE OF ABOUT 60
INPUT TOKENS PER SECOND), BUT IT IS FELT THAT THIS IS NOT
UNREASONABLE FOR A COMPILER OF THE GENERALITY OF ^I^M^P.
.PARAGRAPH
^THE ^I^M^P72 COMPILER IS PROVIDED (COURTESY OF THE ^YALE ^DEPARTMENT OF
^COMPUTER ^SCIENCE) AND MAINTAINED (AS OF THIS WRITING) BY THE AUTHOR,
ON A PURELY INFORMAL BASIS.  ^ALTHOUGH THE AUTHOR FEELS THAT THE ^I^M^P72
COMPILER IS PRACTICALLY BUG-FREE, AND INTENDS TO MAINTAIN AND UPDATE IT,
THE USER IS REMINDED THAT THIS DOES NOT CONSTITUTE A GUARANTEE THAT IT
IS OR HE WILL.  ^FURTHER DETAILS ON WHERE TO SEND COMPLAINTS MAY BE FOUND
IN ^SECTION 5.
.SUBTITLE 1.3: ^HOW TO ^USE ^I^M^P IN ^ONE ^EASY ^LESSON.
.PAGE
.CENTER
^&1.3: ^HOW TO ^USE ^I^M^P IN ^ONE ^EASY ^LESSON\&
.SKIP 2
.PARAGRAPH
^THIS SECTION IS INTENDED TO GIVE THE EXPERIENCED PROGRAMMER THE
FLAVOR OF ^I^M^P SO THAT HE MAY WRITE SIMPLE PROGRAMS WITHOUT
HAVING TO READ THE ENTIRE MANUAL.
.PARAGRAPH
^I^M^P IS SIMILAR TO ^^FORTRAN II\\ IN POWER, AND A BIT LIKE
^^ALGOL\\ IN FLAVOR.  ^IT HAS NO BLOCK STRUCTURE OR RESERVED WORDS, AND ALL VARIABLES
ARE GLOBAL TO ALL PROGRAMS IN A COMPILATION.  ^STATEMENTS MAY BE
GROUPED, USING PARENTHESES.  ^VARIABLES NEED NOT BE DECLARED UNLESS
THEY ARE ARRAYS.  ^ARRAYS ARE DECLARED BY, E.G., ^^FOO IS 50 LONG\\
AND SUBSCRIPTS WRITTEN, E.G., ^^FOO[I+3]\\.  ^THE ASSIGNMENT
OPERATOR IS "__" AND THE STATEMENT SEPARATOR IS ";".  ^ALL BINARY
ARITHMETIC OPERATORS ARE OF EQUAL PRECEDENCE, AND OPERATIONS ARE
PERFORMED FROM RIGHT TO LEFT (AS IN ^A^P^L).  "__" IS OF THE SAME
PRECEDENCE AS THE ARITHMETIC OPERATORS AND ALSO IS
PERFORMED FROM RIGHT TO LEFT.  
^RELATIONAL OPERATORS ARE EVALUATED AFTER ARITHMETIC OPERATORS.
.PARAGRAPH
^STATEMENTS MAY BE LABELED BY PREFIXING THEM WITH ^^LABEL:\\.
^THE TRANSFER OF CONTROL IS ^^GO TO LABEL\\ AND THE CONDITIONAL
IS ^^A=>B\\ OR ^^A=>B ELSE C\\, WHERE ^B AND ^C ARE
STATEMENTS OR GROUPS OF STATEMENTS (IN PARENTHESES), AND
^A IS AN EXPRESSION (0 IS FALSE, NON-ZERO IS TRUE), PERHAPS
CONTAINING A RELATIONAL OPERATOR (^^EQ, NE, GE, GT, LE, LT)\\.
^THE BASIC ITERATION CONSTRUCT IS ^^A FOR B IN C,D,E\\, WHERE ^A
IS A GROUP OF STATEMENTS (IN PARENTHESES), ^B IS A VARIABLE, AND
^C, ^D AND ^E ARE EXPRESSIONS.  ^A IS EXECUTED FOR
VALUES OF ^B FROM ^C, INCREMENTED BY ^D, TO ^E.
.PARAGRAPH
^AN ^I^M^P SOURCE FILE CONSISTS OF A NUMBER OF STATEMENTS, 
IN FREE FORMAT.  ^THE FILE IS TERMINATED
BY "%%".  ^THE LAST STATEMENT EXECUTED SHOULD
BE ^^FINI(0)\\, WHICH EXITS FROM THE PROGRAM.  ^TO COMPILE THE
^I^M^P PROGRAM ON FILE ^^FOO.IMP\\, CALL THE COMPILER BY THE
MONITOR COMMAND ^^RUN IMP\\ (ON ^^TENEX\\, JUST ^^IMP\\), AND WHEN IT TYPES AN ASTERISK, TYPE
^^FOO.IMP<CR>\\.  ^TO EXECUTE THE RESULTING OBJECT PROGRAM ON
^D^E^CSYSTEM-10, TYPE THE COMMAND ^^EX FOO.REL,/LIBRARY,IMPLIB.LIB\\.
^ON ^^TENEX\\, EXECUTE BY CALLING THE LOADER SUBSYSTEM
WITH THE COMMAND ^^LOADER\\, AND THEN TYPE ^^FOO.REL,/LIMPLIB.LIB<ALTMODE>.\\
.SUBTITLE 1.4: ^DIFFERENCES BETWEEN ^I^M^P72 AND THE ^PREVIOUS ^P^D^P-10 ^I^M^P.
.PAGE
.CENTER
^&1.4: ^DIFFERENCES BETWEEN ^I^M^P72 AND THE ^PREVIOUS ^P^D^P-10 ^I^M^P.\&
.SKIP
.PARAGRAPH
^I^M^P72 CONTAINS ALL FEATURES OF OLD ^P^D^P-10 ^I^M^P WITH THE FOLLOWING
EXCEPTIONS:
.SKIP
.LEFT MARGIN 10
.INDENT -3
1. ^TRACE IS NOT IMPLEMENTED.
.SKIP
.INDENT -3
2. ^RELATIONAL OPERATORS AND ^A=>^B ^E^L^S^E ^C ARE IMPLICITLY PARENTHESIZED
DIFFERENTLY IN A FEW CASES.  ^SEE SECTIONS 2.2 AND 2.2.4.
.SKIP
.INDENT -3
3. ^THE FORMAL SYNTAX OF THE LANGUAGE HAS OTHER MINOR CHANGES WHICH
SHOULD NOT AFFECT THE COMPILATION OF OLD ^I^M^P PROGRAMS IN ^I^M^P72.
^FOR EXAMPLE, ^A__^B IS NOW PERMISSIBLE AS A PARAMETER OF A SUBROUTINE
CALL.  (^THE PARAMETER PASSED IS ^B.)
.LEFT MARGIN 0
.SUBTITLE 1.5: ^I^M^P72 ON ^T^E^N^E^X.
.SKIP 5
.CENTER
^&1.5: ^I^M^P72 ON ^T^E^N^E^X.\&
.SKIP
.PARAGRAPH
^I^M^P72 WAS WRITTEN TO RUN UNDER THE ^D^E^CSYSTEM-10 OPERATING SYSTEM.
^SINCE ^T^E^N^E^X SUPPORTS MOST FEATURES OF ^D^E^CSYSTEM-10, IT WILL BE
POSSIBLE FOR ^T^E^N^E^X USERS TO MAKE USE OF ^I^M^P.  ^CERTAIN ^T^E^N^E^X FEATURES,
SUCH AS REFERRING TO DIRECTORIES BY NAME INSTEAD OF PROJECT,PROGRAMMER
NUMBERS, WILL NOT BE AVAILABLE.
.SUBTITLE 2: ^PROGRAMMER'S ^GUIDE TO ^I^M^P72
.PAGE
.CENTER
^&2: ^PROGRAMMER'S ^GUIDE TO ^I^M^P72\&
.SKIP 2
.SUBTITLE 2.1: ^CONVENTIONS.
.CENTER
^&2.1: ^CONVENTIONS.\&
.SKIP 2
.SUBTITLE 2.1.1: ^LEXICAL.
.CENTER
^&2.1.1: ^LEXICAL.\&
.SKIP
.PARAGRAPH
^THE LANGUAGE IS BASICALLY  FREE-FORM, SUBJECT TO THE FOLLOWING
CONSTRAINTS. ^WORDS REPRESENTING VARIABLE NAMES OR SPECIAL WORDS OF THE
LANGUAGE ARE DELIMITED BY NON ALPHA-NUMERIC CHARACTERS INCLUDING SPACE.
^THEREFORE, SPACES MAY NOT APPEAR INSIDE WORDS OR NUMBERS, AND AT LEAST ONE
DELIMITER MUST APPEAR BETWEEN TWO SUCH WORDS.  ^ALL CHARACTERS HAVING
AN ^^ASCII\\ CHARACTER CODE OF 40^B OR LESS ARE INTERPRETED AS BLANKS,
EXCEPT WHEN ENCLOSED IN !, _# OR ' SIGNS.  ^THUS, STRING CONSTANTS
MAY CONTAIN ANY CHARACTER, INCLUDING TABS AND RETURNS, AND RETURNS
AND LINE FEEDS OUTSIDE !, _# AND ' SIGNS SERVE AS DELIMITERS.
.INDEX SOURCE FORMAT
^AS  A  GENERAL RULE, MAKE THE TEXT  READABLE  AND YOU
WILL FIND THE WORDS PROPERLY DISTINGUISHED.
.PARAGRAPH
^IDENTIFIERS USUALLY CONSIST OF ALPHANUMERIC STRINGS, BUT AN
IDENTIFIER CONTAINING ANY SPECIAL CHARACTER (EXCEPT !) MAY BE
REPRESENTED BY ENCLOSING THE ENTIRE NAME IN ! SIGNS; E.G.,
!^FUNNY*ID.! (SEE ^SECTION 2.2.1).
.PARAGRAPH
^ALL CHARACTERS APPEARING BETWEEN _# SIGNS ARE TREATED AS COMMENTS AND
IGNORED BY THE COMPILER (EXCEPT FOR _# SIGNS IN STRING CONSTANTS AND
BETWEEN ! SIGNS).
.SKIP 3
.SUBTITLE 2.1.2: ^EXPRESSIONS AND ^STATEMENTS.
.INDEX EXPRESSIONS
.INDEX STATEMENTS
.CENTER
^&2.1.2: ^EXPRESSIONS AND ^STATEMENTS.\&
.SKIP
.PARAGRAPH
^IN ^I^M^P, NO DISTINCTION IS MADE BETWEEN EXPRESSIONS AND STATEMENTS.
^ALMOST EVERYTHING IS AN EXPRESSION, AND HAS A VALUE, ALTHOUGH A FEW EXPRESSIONS
LIKE ^G^O ^T^O ^X DO NOT HAVE A VERY USEFUL VALUE.  ^TWO CONSEQUENCES
OF THIS PHILOSOPHY ARE THAT PARENTHESES MAY BE USED FOR GROUPING
WHAT ARE USUALLY CALLED STATEMENTS IN OTHER LANGUAGES, AND THAT
THE STATEMENT SEPARATOR ';' BECOMES A BINARY OPERATOR (WHOSE
VALUE IS THE SECOND OPERAND).
.PARAGRAPH
^THE TERMS "STATEMENT" AND "EXPRESSION" WILL BE USED ALMOST
INTERCHANGEABLY HEREIN.  ^WHEN THE TERM "EXPRESSION" IS USED, IT SHOULD BE
UNDERSTOOD THAT WE MAY BE CONCERNED WITH THE VALUE OF THE EXPRESSION, WHEREAS
WHEN THE TERM "STATEMENT" APPEARS, WE ARE INTERESTED PRIMARILY IN THE EFFECT
OF EXECUTING IT, AND ONLY SECONDARILY, IF AT ALL, IN ITS VALUE.
.SUBTITLE 2.1.3: ^MACHINE ^LANGUAGE ^LEVEL ^PROGRAMMING.
.PAGE
.INDEX REGISTER NAMES
.INDEX MACHINE LANGUAGE PROGRAMMING
.CENTER
^&2.1.3: ^MACHINE ^LANGUAGE ^LEVEL ^PROGRAMMING.\&
.SKIP
.PARAGRAPH
^THE IDENTIFIERS 0^R,1^R,...,15^R REFER TO THE
16 REGISTERS OF THE ^P^D^P-10: 0,1,...,15.  ^THEREFORE YOU MAY
WRITE DOWN EXPRESSIONS WHICH REFER TO PARTICULAR REGISTERS.
^IF YOU WRITE DOWN AN EXPRESSION WHICH CAN BE EVALUATED WITH A
SINGLE INSTRUCTION LIKE '1^R__1^R+^M', THAT INSTRUCTION WILL
ALMOST ALWAYS BE USED TO IMPLEMENT THE EXPRESSION.  ^INSTRUCTIONS WHICH CANNOT
BE EXPRESSED IN THIS WAY MAY BE IMPLEMENTED BY USER-PROVIDED SYNTAX.
.PARAGRAPH
^STATEMENT LABELS ARE USED EXACTLY LIKE VARIABLE NAMES, SO THAT
ONE CAN REFERENCE AND CHANGE INSTRUCTIONS IN THE PROGRAM. ^THUS
'^T__200000000000^B; ^T:^G^O ^T^O ^T' PUTS THE OCTAL INSTRUCTION
'200000000000' INTO THE NEXT WORD AND EXECUTES IT. (^WE HAPPEN TO
KNOW THAT ^G^O ^T^O ^T TAKES JUST ONE INSTRUCTION, AND SO USE IT
TO SET ASIDE A WORD TO STORE IN).
.SKIP 3
.SUBTITLE 2.1.4: ^PROGRAM ^STRUCTURE AND ^SCOPE OF ^VARIABLES.
.TEST PAGE 4
.CENTER
^&2.1.4: ^PROGRAM ^STRUCTURE AND ^SCOPE OF ^VARIABLES.\&
.SKIP
.PARAGRAPH
^PROGRAM STRUCTURE IS MORE OR LESS LIKE THAT OF THE ^P^D^P-10 ^F^O^R^T^R^A^N SYSTEM.
^THUS A MAIN PROGRAM, IF ANY, COMES FIRST, THEN SUBROUTINES, IF ANY, FOLLOW.
.INDEX SCOPE OF VARIABLES
.PARAGRAPH
^IN CONTRAST TO THE ^F^O^R^T^R^A^N CONVENTION, ALL VARIABLES IN ^I^M^P ARE GLOBAL TO
THE ENTIRE SET OF SUBROUTINES COMPILED AT THE SAME TIME, EXCEPT THAT FORMAL
ARGUMENTS OF A SUBROUTINE ARE LOCAL WITHIN THAT SUBROUTINE.  ^THAT IS, ANY TWO
.INDEX ARGUMENTS OF SUBROUTINES
REFERENCES TO THE SAME VARIABLE NAME WITHIN A SINGLE ^I^M^P COMPILATION WILL REFER
TO THE SAME MEMORY LOCATION, EVEN IF THE REFERENCES ARE WITHIN DIFFERENT SUBROUTINES.  ^HOWEVER, REFERENCES TO FORMAL ARGUMENTS OF SUBROUTINES WILL HAVE THE
EFFECT OF REFERENCES TO THE MEMORY LOCATION CONTAINING THE ACTUAL ARGUMENT IN
THE CALL OF THE SUBROUTINE.  ^THUS REFERENCES TO FORMAL SUBROUTINE ARGUMENTS WILL
NOT AFFECT VARIABLES OF THE SAME NAME IN OTHER SUBPROGRAMS IN THE SAME
COMPILATION.
.PARAGRAPH
.INDEX ^^LOCAL\\ DECLARATION
^THE DECLARATION ^^LOCAL\\ IS PROVIDED TO DEFEAT THE FACT THAT
VARIABLES ARE NORMALLY GLOBAL TO THE ENTIRE MODULE.  ^AN IDENTIFIER
WHICH IS DECLARED TO BE ^^LOCAL\\ WILL BE REPLACED THROUGHOUT THE
SUBROUTINE IN WHICH IT IS SO DECLARED BY A UNIQUE NAME, WHICH WILL
NOT BE USED OUTSIDE THE SUBROUTINE.  ^THE IDENTIFIER WILL THEREFORE
APPEAR LOCAL TO THE SUBROUTINE.
.PARAGRAPH
^I^M^P USES THE ^F^O^R^T^R^A^N SUBROUTINE CALLING CONVENTIONS (SEE SECT. 2.2.5).
.INDEX ^^FORTRAN\\, COMPATIBILITY WITH
^THUS, ^I^M^P AND ^F^O^R^T^R^A^N PROGRAMS MAY CALL EACH OTHER AT WILL.  ^HOWEVER, THE
^I^M^P AND ^F^O^R^T^R^A^N ^I/^O LIBRARY SUBROUTINES HAVE BEEN KNOWN TO CONFLICT AT TIMES.
^IT IS THEREFORE ADVISABLE NOT TO PERFORM FORMATTED ^I/^O FROM BOTH ^I^M^P AND
^F^O^R^T^R^A^N SUBROUTINES IN THE SAME PROGRAM.
.SUBTITLE 2.1.5: ^COMPILER ^VERSION ^NUMBER ^CONVENTIONS.
.SKIP 4
.TEST PAGE 5
.CENTER
^&2.1.5: ^COMPILER ^VERSION ^NUMBER ^CONVENTIONS.\&
.INDEX VERSION NUMBER OF COMPILER
.PARAGRAPH
^THE COMPILER VERSION NUMBER AND CREATION DATE APPEAR ON ITS PROMPT
AND ON THE LISTINGS IT PRODUCES.  ^VERSION 1.5 IS RELEASE 5 OF
MAJOR VERSION 1.  ^A NEW RELEASE MAY DIFFER FROM THE PREVIOUS ONE
BY HAVING LANGUAGE ADDITIONS AND/OR FEWER BUGS.  ^A MAJOR VERSION
CONTAINS SUBSTANTIAL CHANGES.  ^AN EXTENSION LETTER (E.G., 1.5(^A))
APPEARS IN USER-CREATED EXTENSIONS OF THE COMPILER (SEE ^SECTION 3.1
FOR THE METHOD OF CREATING AN EXTENDED COMPILER VERSION USING THE
^C, ^U AND ^V SWITCHES).  ^THE DATE IS THE CREATION DATE OF THE
CURRENT COPY OF THE VERSION BEING RUN.
.SUBTITLE 2.2:  ^THE ^EXPRESSIONS.
.PAGE
.CENTER
^&2.2:  ^THE ^EXPRESSIONS.\&
.SKIP
.PARAGRAPH
.INDEX ORDER OF EVALUATION
.INDEX EXPRESSIONS
^THE EXPRESSIONS OF THE LANGUAGE ARE LISTED HERE.  ^EXPRESSIONS MAY BE
GROUPED EXPLICITLY BY PARENTHESES.  ^WHERE PARENTHESES ARE OMITTED, THE FOLLOWING
IS THE ORDER IN WHICH SUBEXPRESSIONS ARE EVALUATED:
.LEFT MARGIN 10
.SKIP
1. ^UNARY OPERATORS AND FUNCTIONS.
.SKIP
2. ^BINARY OPERATORS EXCEPT ";" (BUT INCLUDING "__").
.SKIP
3. ^RELATIONAL OPERATORS.
.SKIP
4. ^CONDITIONALS.
.SKIP
5. ";".
.LEFT MARGIN 0
.PARAGRAPH
^WHEN TWO OPERATORS OF EQUAL PRECEDENCE APPEAR CONSECUTIVELY IN AN EXPRESSION, THE RIGHTMOST IS PERFORMED FIRST (AS IN ^A^P^L).  ^E.G., ^A*^B+^C IS EVALUATED
AS ^A*(^B+^C).  ^E^X^C^E^P^T^I^O^N: THE ORDER OF EVALUATION OF RELATIONAL OPERATORS ON THE
SAME LEVEL - E.G., ^A<^B ^G^E ^C - IS NOT DEFINED.
.PARAGRAPH
^IN "^A; ^B", ^A IS EVALUATED BEFORE ^B.  ^IN A CONDITIONAL, THE IMPLICAND WILL
BE EVALUATED AFTER THE CONDITION IS EVALUATED, IF AT ALL.  ^OTHER THAN THE
RESTRICTIONS LISTED ABOVE, ^I^M^P PLACES NO RESTRICTIONS ON THE ORDER OF EVALUATION
OF ARGUMENTS OF OPERATORS.
.PARAGRAPH
^IN THE FOLLOWING TABLE, IF NO VALUE IS SPECIFIED FOR AN
EXPRESSION, THEN THE VALUE OF THAT EXPRESSION IS NOT DEFINED AND/OR
NOT USEFUL.
.SKIP 4
.TAB STOPS 20
.SUBTITLE 2.2.1:  ^VARIABLES AND ^CONSTANTS
.INDEX VARIABLES
.INDEX CONSTANTS
.INDEX FLEXADECIMAL
.CENTER
^&2.2.1:  ^VARIABLES AND ^CONSTANTS\&
.SKIP 2
.NOFILL
^S^A^M^P^L^E ^E^X^P^R^E^S^S^I^O^N   ^M^E^A^N^I^N^G
.FILL
.LEFT MARGIN 15
.SKIP 2
.INDENT -15
19576
.BREAK
^INTEGER NUMBERS (BASE 10).
.SKIP
.INDENT -15
777000^B
.BREAK
^DIGITS FOLLOWED BY '^B': OCTAL CONSTANTS
.SKIP
.INDENT -15
2^A^F^B16
.BREAK
^A STRING OF DIGITS AND LETTERS BEGINNING WITH A DIGIT AND
ENDING IN '^BNN', WHERE NN IS A DECIMAL NUMBER.  ^THESE ARE
CONSTANTS IN BASE NN (CALLED "FLEXADECIMAL" CONSTANTS).
^THE LETTERS AND DIGITS TO THE LEFT OF THE LAST ^B ARE
INTERPRETED AS A CONSTANT IN BASE NN.  ^E.G., 2^A^B^B16 IS
THE BASE 16 CONSTANT 2^A^B (683 DECIMAL).  10100^B2 IS THE
BINARY CONSTANT 10100, OR 20 DECIMAL.  ^THE BASE MAY BE
ARBITRARILY LARGE, BUT ONLY DIGITS AND THE LETTERS ^A-^Z MAY
BE USED TO REPRESENT DIGITS.  (^A-^Z ARE THE DIGITS 10-35.)
^NOTE THAT A CONSTANT STARTING WITH A LETTER IS NOT LEGAL.
FOR EXAMPLE, ^A^B^B12 IS A VARIABLE NAME; THE DESIRED CONSTANT
MAY BE WRITTEN 0^A^B^B12.
.SKIP
.INDENT -15
.INDEX FLOATING CONSTANT
3.27"-5
.BREAK
^FLOATING POINT CONSTANT.  ^CONSISTS OF A STRING OF DIGITS CONTAINING
AN EMBEDDED DECIMAL POINT (I.E., .01 AND 3. ARE NOT LEGAL), AND
FOLLOWED OPTIONALLY BY " AND A SIGNED POWER-OF-TEN SCALING FACTOR.
.SKIP
.INDENT -20
^A
.BREAK
^VARIABLE NAME. ^ANY STRING OF LETTERS AND DIGITS NOT
INTERPRETABLE AS ONE OF THE ABOVE FORMS OF CONSTANTS.
.SKIP
.INDENT -15
9^R
.BREAK
^NUMBERS 0 THROUGH 15 FOLLOWED BY '^R' NAME THE CORRESPONDING
^P^D^P-10 REGISTERS.
.SKIP
.INDENT -15
'^A^B^CDEF'
.BREAK
.INDEX STRING CONSTANTS
^A^S^C^I^I STRINGS: STORED LEFT JUSTIFIED, ZERO FILLED
AND SPILLING INTO SUCCESSIVE WORDS. ^AN ^A^S^C^I^I STRING
ALWAYS TERMINATES WITH AT LEAST ONE ZERO CHARACTER.
^THE CHARACTER ' IS REPRESENTED WITHIN A STRING BY TWO SUCCESSIVE
QUOTES: ''.  ^THUS, THE STRING CONSISTING OF ONE SINGLE QUOTE
WOULD BE WRITTEN '''' (BUT WOULD PRINT AS ').  ^THE STRING '' IS THE
SAME AS 0.
.SKIP
.INDENT -15
^R'^STG'
.BREAK
^A 1 TO 5 CHARACTER ^A^S^C^I^I STRING PREFIXED BY THE
LETTER ^R IS A CONSTANT CONTAINING THE ^A^S^C^I^I
CHARACTERS STORED RIGHT-JUSTIFIED.
(^R MAY ALSO PREFIX A STRING CONSTANT WRITTEN AS !'^STG! -
SEE FOLLOWING PARAGRAPH.)
.SKIP
.INDENT -15
!^ANY THING.!
.BREAK
^SPECIAL IDENTIFIER: ANY STRING OF CHARACTERS NOT CONTAINING
A '!', BRACKETED BY '!'S.  ^THE STRING OF CHARACTERS IS CONSIDERED TO BE A SINGLE IDENTIFIER OR SYMBOL.  ^IN PARTICULAR,
THE FOLLOWING INTERPRETATIONS ARE MADE:
.BREAK
.INDENT 3
^ONE SPECIAL CHARACTER IS RECOGNIZED AS ITSELF.  ^E.G., !+! IS THE SAME AS +.
.INDENT 3
^ANY STRING STARTING WITH A SINGLE QUOTE IS RECOGNIZED AS THE
^A^S^C^I^I STRING CONTAINING THE REMAINDER OF THE STRING.  ^E.G.,
!'^DON'T! IS THE ^A^S^C^I^I STRING CONSTANT "^DON'T".
.INDENT 3
^ANY OTHER STRING IS INTERPRETED AS AN IDENTIFIER WHOSE NAME
IS EXACTLY THE STRING APPEARING BETWEEN THE ! SIGNS.  ^THIS ALLOWS
VARIABLE NAMES CONTAINING SPECIAL CHARACTERS.
.SKIP
^THE USER EMPLOYING VARIABLE NAMES CONTAINING SPECIAL
CHARACTERS IS WARNED THAT THE COMPILER GENERATES TEMPORARY
LABELS PREFIXED WITH A %, AND SYNTACTIC CLASS NAMES IN
SYNTAX STATEMENTS PREFIXED WITH A _#.  ^USE BY THE USER OF
IDENTICAL NAMES MAY PRODUCE ANOMALOUS RESULTS.
.SKIP
.INDENT -15
^A[^E]
.BREAK
^THE ^E'TH WORD OF ARRAY '^A' STARTING FROM ZERO.  ^A IS
ANY VARIABLE NAME OR CONSTANT, AND ^E IS ANY EXPRESSION.
.SKIP
.INDENT -15
[^E]
.BREAK
^THE ^E'TH WORD OF MEMORY: THUS THE CONTENTS OF THE
WORD WHOSE ADDRESS IS ^E.
.SKIP
.INDENT -15
.INDEX ^L^O^C
^L^O^C(^A)
.BREAK
^THE ADDRESS OF THE MEMORY LOCATION CONTAINING ^A.  ^A MAY
BE A SIMPLE OR SUBSCRIPTED VARIABLE.
.SKIP 4
.SUBTITLE 2.2.2:  ^UNARY ^OPERATORS AND ^FUNCTIONS.
.INDEX UNARY OPERATORS
.INDEX OPERATORS, UNARY
.CENTER
^&2.2.2:  ^UNARY ^OPERATORS AND ^FUNCTIONS.\&
.SKIP 2
.INDENT -15
-^A
.BREAK
^NEGATIVE OF ^A (TWOS COMPLEMENT)
.SKIP
.INDENT -15
.INDEX ^N^O^T
^N^O^T ^A
.BREAK
^ONES COMPLEMENT OF ^A
.SKIP
.INDENT -15
.INDEX PARENTHESES
(^A)
.BREAK
^PARENTHESES USED TO GROUP EXPRESSIONS: VALUE IS ^A.
^A MAY BE ANY EXPRESSION, INCLUDING A STRING OF STATEMENTS.
.SKIP 4
.SUBTITLE 2.2.3: ^BINARY ^OPERATORS.
.INDEX BINARY OPERATORS
.INDEX OPERATORS, BINARY
.INDEX ARITHMETIC OPERATORS
.INDEX OPERATORS, ARITHMETIC
.CENTER
^&2.2.3: ^BINARY ^OPERATORS.\&
.SKIP 2
.INDENT -15
^A__^B
.BREAK
^STORES THE VALUE OF ^B IN ^A.  ^THE VALUE OF THIS EXPRESSION
IS THE VALUE STORED IN ^A.  ^IF ^A AND ^B ARE OF DIFFERENT
ARITHMETIC TYPES, THE VALUE OF ^B IS CONVERTED TO THE TYPE OF ^A
BEFORE STORING.
.SKIP
.INDENT -15
^A<=^B
.BREAK
^STORES THE VALUE OF ^B IN ^A, WITHOUT PERFORMING ANY TYPE CONVERSION
IF ^A AND ^B ARE OF DIFFERENT ARITHMETIC TYPES.
.SKIP
.INDENT -15
^A; ^B
.BREAK
; IS A BINARY OPERATOR WHOSE VALUE IS ^B.  ^IT IS USED AS
A STATEMENT SEPARATOR.  ^IT ALWAYS EVALUATES ^A FIRST, THEN
^B.  ^EXAMPLE: THE VALUE OF (^A__5; ^B__3) IS 3.
.SKIP
.INDENT -15
^A+^B
.INDENT -15
^A-^B
.INDENT -15
^A*^B
.INDENT -15
^A/^B
.BREAK
^THESE ARE THE ARITHMETIC OPERATORS.   ^THEY ARE EITHER
INTEGER (IF BOTH OPERANDS ARE OF TYPE INTEGER) OR
ROUNDED FLOATING POINT (IF EITHER OPERAND IS REAL.  ^IF ONE OPERAND IS INTEGER, IT IS CONVERTED TO REAL BEFORE THE 
OPERATION IS PERFORMED.).
(^CAUTION: WHEN / IS USED WITH REGISTER NAMES AS
OPERANDS, IN GENERAL THE DIVIDE IS PERFORMED IN
A DIFFERENT REGISTER THAN THAT HOLDING EITHER
OPERAND, IN ORDER TO AVOID DIFFICULTIES DUE TO THE DIVIDE OPERATION
REQUIRING TWO ADJACENT REGISTERS.  ^HOWEVER, THE EXPRESSION ^R__^R/^S,
WHERE ^R IS A REGISTER NAME, IS COMPILED TO PERFORM
THE DIVIDE IN REGISTER ^R.)
.SKIP
.INDENT -15
^A//^B
.BREAK
^THE REMAINDER OF ^A WHEN DIVIDED BY ^B.  ^IF EITHER ^A
OR ^B OR BOTH ARE FLOATING POINT, THEY ARE CONVERTED
TO FIXED POINT BEFORE THE COMPUTATION IS PERFORMED.
^THE RESULT IS ALWAYS INTEGER.
.SKIP
.INDENT -15
^A<^B (OR ^A ^L^T ^B)
.INDENT -15
^A>^B (OR ^A ^G^T ^B)
.INDENT -15
^A=^B (OR ^A ^E^Q ^B)
.INDENT -15
^A ^L^E ^B
.INDENT -15
^A ^G^E ^B
.INDENT -15
^A ^N^E ^B
.BREAK
.INDEX RELATIONAL OPERATORS
.INDEX OPERATORS, RELATIONAL
^RELATIONAL OPERATORS.  ^THESE HAVE THE VALUE -1
IF THE RELATION HOLDS, OTHERWISE 0.
^THE WORDS ^L^E, ^G^E AND ^N^E ARE USED FOR THE OPERATORS
'LESS THAN OR EQUAL TO', 'GREATER THAN OR EQUAL TO'
AND 'NOT EQUAL TO'.  ^N^O^T^A ^B^E^N^E: ^RELATIONAL EXPRESSIONS MUST
BE ENCLOSED IN PARENTHESES WHEREVER THEY APPEAR EXCEPT AS
THE CONDITION IN A CONDITIONAL EXPRESSION.
.SKIP
.INDEX LOGICAL OPERATORS
.INDEX OPERATORS, LOGICAL
.INDENT -15
^A ^O^R ^B
.INDENT -15
^A ^A^N^D ^B
.INDENT -15
^A ^X^O^R ^B
.INDENT -15
^A ^E^Q^V ^B
.BREAK
^BIT-BY-BIT LOGICAL BINARY OPERATORS.
.SKIP
.INDEX SHIFT OPERATORS
.INDEX OPERATORS, SHIFT
.INDENT -15
^A ^L^S ^B
.BREAK
  ^A LEFT SHIFTED ^B BITS,  END OFF, ZERO FILLED.
.SKIP
.INDENT -15
^A ^R^S ^B
.BREAK
  ^A RIGHT SHIFTED ^B BITS, END OFF, ZERO FILLED.
.SKIP
.INDENT -15
^A ^L^R^O^T ^B
.BREAK
^A LEFT SHIFTED CIRCULARLY ^B BITS.
.SKIP
.INDENT -15
^A ^R^R^O^T ^B
.BREAK
^A RIGHT SHIFTED CIRCULARLY ^B BITS.
.SKIP
.INDENT -15
^A ^A^L^S ^B
.BREAK
^A LEFT SHIFTED ^B BITS, SIGN EXTENDED.
.SKIP
.INDENT -15
^A ^A^R^S ^B
.BREAK
^A RIGHT SHIFTED ^B BITS, SIGN EXTENDED.
(^IF ^B IS NEGATIVE IN THE ABOVE INSTRUCTIONS, THE
DIRECTION OF SHIFT IS REVERSED.)
.SKIP 4
.SUBTITLE 2.2.4: ^CONTROL ^EXPRESSIONS.
.CENTER
^&2.2.4: ^CONTROL ^EXPRESSIONS.\&
.INDEX CONTROL EXPRESSIONS
.INDEX CONDITIONAL EXPRESSIONS

.SKIP 2
.INDENT -15
^A=>^B
.BREAK
^IF ^A IS NOT 0, EVALUATE ^B (^READ AS "^A IMPLIES ^B").  ^THUS,
^K=>^X__1 DOES NOTHING IF ^K IS ZERO, OR SETS ^X TO 1 IF ^K IS
NON-ZERO.  ^X<^Y=>(^P__1;^Q__2) CHANGES ^P AND ^Q IF ^X IS
LESS THAN ^Y, OTHERWISE DOES NOTHING.  ^N^O^T^A ^B^E^N^E: ^IF ^A IS
A RELATIONAL EXPRESSION, IT NEED NOT, AND FOR BEST OBJECT CODE
SHOULD NOT, BE ENCLOSED IN PARENTHESES. ^IF ^A IS A CONSTANT,
OR AN EXPRESSION INVOLVING ONLY CONSTANTS, THEN THE CODE
GENERATED BY THE COMPILER FOR THE EXPRESSION ^A=>^B WILL
CONSIST EITHER OF ^B, IF ^A IS NON-ZERO, OR NOTHING AT ALL,
IF ^A IS ZERO.  ^THIS ALLOWS CODE TO BE COMPILED CONDITIONALLY IF, FOR EXAMPLE, ^A IS AN IDENTIFIER DEFINED BY SYNTAX TO
BE A CONSTANT.  ^IN THE CASE THAT ^B IS NOT COMPILED DUE TO
^A BEING A CONSTANT 0, ANY TAGS CONTAINED WITHIN ^B WILL NOT
BE DEFINED, BUT DECLARATIONS CONTAINED IN ^B WILL TAKE
EFFECT.
.INDEX ^E^L^S^E
.SKIP
.INDENT -15
^A=>^B ^E^L^S^E ^C
.BREAK
^THIS EXPRESSION HAS THE VALUE ^B IF ^A IS NONZERO, AND ^C IF
^A IS ZERO.   ^IT WILL EVALUATE ONLY ONE OF ITS OPERANDS EACH
TIME IT IS EXECUTED; THUS IT CAN BE USED TO REPLACE THE
CONSTRUCT "^A=>(^B; ^G^O ^T^O ^F^O^O); ^C; ^F^O^O:" IF THE USER DOES NOT
MIND THE VALUE BEING COMPUTED AND IGNORED (WHICH COSTS A FEW EXTRA INSTRUCTIONS OF OBJECT CODE).  ^N^O^T^A ^B^E^N^E: ^THE
EXPRESSION ^A__^B=>^X ^E^L^S^E ^Y, E.G., WILL BE INTERPRETED AS
(^A__^B)=>^X ^E^L^S^E ^Y.  ^TO ASSIGN THE OBVIOUS INTERPRETATION TO
IT, WRITE ^A__(^B=>^X ^E^L^S^E ^Y).  ^IF ^C CONTAINS ANOTHER =>-^E^L^S^E
CLAUSE, THEN ^C SHOULD BE ENCLOSED IN PARENTHESES.
.INDEX ^F^O^R LOOPS
.INDEX ITERATION
.SKIP
.INDENT -15
^A ^F^O^R ^B ^I^N ^C,^D,^E
.INDENT -15
^A ^F^O^R ^B ^T^O ^E
.INDENT -15
^A ^F^O^R ^B ^F^R^O^M ^E
.BREAK
^THESE EXPRESSIONS PERFORM REPEATED EXECUTION OF THE
EXPRESSION ^A WITH DIFFERENT VALUES OF THE VARIABLE ^B.  ^THE ^I^N FORM
EXECUTES ^A WITH VALUES OF ^B EQUAL TO ^C, ^C+^D, ^C+2*^D,...,
^E; THE ^T^O FORM FOR ^B EQUAL TO 0,1,...,^E, AND THE ^F^R^O^M
FORM FOR ^B EQUAL TO ^E,^E-1,...,0.  ^IN EVERY CASE THE
EXPRESSION ^A IS EVALUATED AT LEAST ONCE REGARDLESS OF THE
VALUES OF ^C, ^D AND ^E.  ^IN THE ^I^N CASE WHEN ^D IS NOT A
CONSTANT, ^B MUST EXACTLY REACH THE VALUE OF ^E.  ^E.G., IN
.SKIP
.JUSTIFY OFF
.NOFILL
          ^^I__2;
          (A[J]__0) FOR J IN 0,I,9\\
.SKIP
.FILL
THE LOOP WILL NEVER TERMINATE.  ^IN ALL OTHER CASES, THE LOOP
TERMINATES WHEN ^B PASSES THE TERMINAL VALUE.
^C, ^D AND ^E MAY BE ANY EXPRESSIONS, BUT IN THE ^I^N AND ^T^O
CASES ^D AND ^E WILL BE EVALUATED ONCE PER ITERATION OF THE
LOOP.  ^THE ^F^R^O^M CASE GENERATES THE MOST EFFICIENT CODE AND
IS THEREFORE TO BE PREFERRED.
^IF CONTROL IS TRANFERRED FROM WITHIN THE LOOP, THE
VALUE OF THE INDEX VARIABLE ^B IS PRESERVED.  ^THE VALUE OF ^B
FOLLOWING NORMAL TERMINATION OF THE LOOP IS UNDEFINED.
.INDENT 5
^THE SPECIAL CASES ^^(A[I]__B[I]) FOR I TO/FROM V\\, WHERE ^A AND ^B
ARE INTEGER ARRAYS AND ^V IS A SINGLE VARIABLE OR CONSTANT, ARE COMPILED
AS A BLOCK TRANSFER INSTRUCTION.  ^THE USER IS CAUTIONED THAT IN THE
^^FROM\\ CASE, IF ^A AND ^B OVERLAP, THE CODE PRODUCED WILL BE
INCORRECT.  ^IN MORE GENERAL CASES, BLOCK TRANSFERS MAY BE
SPECIFIED BY THE ^^MOVE\\ CONSTRUCT (^SECTION 2.2.9).
.INDEX BLOCK TRANSFERS
.INDEX ^W^H^I^L^E LOOPS
.SKIP
.INDENT -15
^W^H^I^L^E ^A ^D^O ^B
.BREAK
^REPEATEDLY EVALUATES THE EXPRESSION ^A, AND, IF IT
IT IS NONZERO (TRUE), EVALUATES THE EXPRESSION ^B.
^IF ^A IS ZERO (FALSE), CONTROL PASSES TO THE NEXT
STATEMENT.  ^IF ^A IS INITIALLY ZERO, ^B IS NEVER EXECUTED.
.INDEX ^^UNTIL\\
.SKIP
.INDENT -15
^^A UNTIL B\\
.BREAK
^THIS EXPRESSION EVALUATES THE EXPRESSION ^A, THEN EVALUATES ^B AND IF
^B IS FALSE (ZERO) IT REPEATS.  ^EVEN IF ^B IS INITIALLY TRUE, ^A IS
ALWAYS EXECUTED AT LEAST ONCE.
.INDEX ^G^O ^T^O
.INDEX TRANSFER OF CONTROL
.SKIP
.INDENT -15
^G^O ^T^O ^E
.BREAK
^TRANSFER CONTROL TO THE MEMORY LOCATION ^E.  ^E WILL USUALLY
BE A TAG, BUT MAY BE A SUBSCRIPTED VARIABLE.  FOR EXAMPLE,
^G^O ^T^O ^T^A^G IS EQUIVALENT TO ^G^O ^T^O [^L^O^C(^T^A^G)].
.SKIP
.INDENT -15
^G^O ^T^O (^L0,^L1,...,^L^N) ^E
.BREAK
^THIS EXPRESSION TRANSFERS CONTROL TO THE LABEL ^LI,
WHERE I IS THE VALUE OF EXPRESSION ^E, AND ^L0,...,^L^N
ARE IDENTIFIERS.  ^IF ^E<0 OR ^E>^N, THE EFFECT IS UNDEFINED.
.INDEX TAGS
.SKIP
.INDENT -15
^T:^A
.BREAK
^THE EXPRESSION ^A IS TAGGED WITH THE LABEL ^T.  ^TWO USES OF
THIS ARE: ^G^O ^T^O ^T TRANSFERS CONTROL TO THIS POINT IN THE
PROGRAM, AND REFERENCES TO THE VARIABLE ^T WILL REFER TO THE
FIRST INSTRUCTION WORD IN THE EXPRESSION ^A.
^TO INSERT A TAG WHERE AN EXPRESSION DOES NOT IMMEDIATELY FOLLOW,
SUCH AS BEFORE A ')', WRITE ^T^A^G:0.
.SUBTITLE 2.2.5: ^PROGRAMS, ^SUBPROGRAMS AND ^SUBPROGRAM ^CALLS.
.SKIP 4
.TEST PAGE 8
.CENTER
^&2.2.5: ^PROGRAMS, ^SUBPROGRAMS AND ^SUBPROGRAM ^CALLS.\&
.SKIP 2
.INDENT -15
^A%%
.BREAK
^AN ^I^M^P PROGRAM CONSISTS OF AN ^I^M^P EXPRESSION FOLLOWED BY
TWO % SIGNS.  ^THE % SIGNS TERMINATE THE INPUT FILE AS FAR
AS THE COMPILER IS CONCERNED.
.INDEX ^S^U^B^R
.INDEX SUBROUTINE DEFINITIONS
.SKIP
.INDENT -15
^S^U^B^R ^A(^B,^C) ^I^S ^D
.BREAK
^DEFINE A SUBROUTINE (OR FUNCTION) NAMED ^A, WITH FORMAL
ARGUMENTS ^B AND ^C.  ^THE VALUE OF THE SUBROUTINE  IS ^D,
(UNLESS THE SUBROUTINE IS EXITED VIA A ^R^E^T^U^R^N STATEMENT,
Q.V.).  ^THE NORMAL EXIT FROM THE SUBROUTINE IS BY "RUNNING
OFF THE END" OF THE EXPRESSION ^D.  ^EXAMPLE:
.SKIP
^S^U^B^R ^A^B^S(^A) ^I^S (^A<0=>-^A ^E^L^S^E ^A);
.SKIP
IS A SUBROUTINE WHOSE VALUE IS THE ABSOLUTE VALUE OF ITS
ARGUMENT. ^WITH THIS DEFINITION ^P__^A^B^S(^Q) CALLS THE SUBROUTINE ^A^B^S AND SETS ^P TO THE VALUE OF ^Q.
.INDEX SUBROUTINE LINKAGE
^THE ARGUMENTS OF A SUBROUTINE "SHARE" THE MEMORY LOCATION OF
THE ACTUAL ARGUMENTS WITH WHICH THE SUBROUTINE IS CALLED; THAT IS,
CHANGING THE VALUE OF ONE OF THE PARAMETERS IN THE SUBROUTINE WILL
CHANGE THE VALUE OF THE VARIABLE IN THE CALLING PROGRAM WHICH
CORRESPONDS TO THAT ARGUMENT.
^THE LINKAGE GENERATED BY THE SUBPROGRAM CALL
^F(^A1,^A2,...,^AN) IS
.SKIP
.NOFILL
.LEFT MARGIN 25
^J^S^A	16,^F
^J^U^M^P	^A1
^J^U^M^P	^A2
  ...
^J^U^M^P	^AN
(RETURN)
.FILL
.LEFT MARGIN 15
.SKIP
^THE SUBPROGRAM REFERS TO ITS I-TH ARGUMENT BY
@I-1(16), AND RETURNS VIA A ^J^R^A @N(16).
^CONSEQUENTLY, IF A SUBPROGRAM IS CALLED WITH MORE
ARGUMENTS THAN IT EXPECTS, NO HARM IS DONE, AND
IF IT IS CALLED WITH FEWER, IT WILL RETURN TO A
RANDOM PLACE FOLLOWING THE CALL (UNLESS IT BLOWS
.INDEX ^^FORTRAN\\, COMPATIBILITY WITH
UP TRYING TO REFERENCE A NON-EXISTANT ARGUMENT
FIRST).
^FUNCTIONS RETURN THEIR VALUE IN REGISTER 0^R.
  ^THIS CALLING SEQUENCE IS COMPATIBLE WITH
^F^O^R^T^R^A^N AT THE CURRENT TIME (^JUNE 1973).  ^IN THE
CASE OF COMPILING PURE (RE-ENTRANT) CODE, THE SAME
CALLING SEQUENCE IS USED, WITH A TWO-WORD ENTRY
BLOCK BEING RELEGATED TO THE LOW SEGMENT.
.SKIP
.INDENT -15
^S^U^B^R ^A() ^I^S ^D
.BREAK
^DEFINE A SUBROUTINE (OR FUNCTION) NAMED ^A WITH NO FORMAL
ARGUMENTS, AND WITH VALUE ^D.
.INDEX ^^RETURN\\
.SKIP
.INDENT -15
^R^E^T^U^R^N ^E
.BREAK
^RETURN FROM THE SUBROUTINE IN WHICH THIS STATEMENT APPEARS.
^THE VALUE RETURNED BY THE SUBROUTINE IS ^E.
.SKIP
.INDENT -15
^A(^B,^C,^D)
.BREAK
^EXECUTE THE FUNCTION ^A WITH PARAMETERS ^B,^C,^D:
^THE VALUE OF THIS EXPRESSION IS THE VALUE OF THE
FUNCTION.  (^SINCE THERE IS NO DISTINCTION IN ^I^M^P BETWEEN
FUNCTIONS AND SUBROUTINES, THIS EXPRESSION IS ALSO USED
                     TO CALL ^A AS A SUBROUTINE WITH THE INDICATED PARAMETERS.)
.SKIP
.INDENT -15
^A()
.BREAK
^EXECUTE THE FUNCTION ^A WITH NO PARAMETERS.
.SKIP 4
.SUBTITLE 2.2.6: ^BYTE ^ACCESS.
.CENTER
^&2.2.6: ^BYTE ^ACCESS.\&
.INDEX BYTES
.INDEX PARTIAL WORD ACCESS
.SKIP 2
.INDENT -15
^A<^B,^C>
.BREAK
^THIS OBJECT IS CALLED A "BYTE".
^A IS A VARIABLE, EITHER SIMPLE OR SUBSCRIPTED; ^B AND ^C ARE
ANY EXPRESSIONS.  ^A<^B,^C> DESIGNATES THE PORTION OF THE WORD
^A CONSISTING OF ^B BITS, LOCATED ^C BITS FROM THE RIGHT HAND
SIDE OF THE WORD.  ^THUS, E.G., ^A<12,12> DESIGNATES THE
CENTER 12 BITS OF ^A, ^A<1,35> IS THE SIGN BIT.  ^A BYTE MAY
BE USED AS AN OPERAND, OR HAVE A VALUE STORED IN IT.
^EXAMPLE: THE PROGRAM FRAGMENT
.SKIP
.NOFILL
.LEFT MARGIN 25
^A__3;
(^A<9,^I+9>__3+^A<9,^I>) ^F^O^R ^I ^I^N 0,9,18;
.SKIP
.FILL
.LEFT MARGIN 15
HAS THE EFFECT OF SETTING ^A TO 014011006003^B.
.SKIP
^THE CONSTRUCTS ^A<^R> AND ^A<^L> DESIGNATE THE RIGHT
AND LEFT HALF WORDS OF ^A.  ^THEY ARE EQUIVALENT TO
^A<18,0> AND ^A<18,18> RESPECTIVELY.
.INDEX ^B^Y^T^E^P
.INDEX BYTE POINTERS
.SKIP
.INDENT -15
^B^Y^T^E^P ^A<^I,^J>
.BREAK
^THIS EXPRESSION HAS THE VALUE OF A ^P^D^P-10 BYTE POINTER
TO THE DESIGNATED BYTE.  ^ITS USEFULNESS LIES IN THE
ABILITY TO WRITE ^X__^B^Y^T^E^P ^A<^B,^C> AND DO BYTE ACCESS BY
REFERENCING ^X, AS EXPLAINED IN THE NEXT PARAGRAPH.  ^IF ^I AND ^J ARE
NOT CONSTANTS, THE BYTE POINTER WILL BE COMPUTED WITH
THEIR VALUES AT THE TIME THE STATEMENT IS EXECUTED AND WILL NOT BE REEVALUATED IF
^I AND ^J CHANGE VALUE LATER.
.SKIP
.INDENT -15
<^X>
.BREAK
^X MUST CONTAIN A BYTE POINTER.  (^THIS MAY BE ACCOMPLISHED
BY ^X__^B^Y^T^E^P ^A<^I,^J>.)  ^THEN <^X> REFERS TO THE BYTE DESIGNATED
BY THE BYTE POINTER.
.SKIP
.INDENT -15
<+^X>
.BREAK
^X MUST CONTAIN A BYTE POINTER.  ^WHEN <+^X> IS EVALUATED, IT
                     INCREMENTS THE BYTE POINTER, AND ITS VALUE IS THE BYTE THEN
POINTED TO.  ^INCREMENTING A BYTE POINTER TO ^A<^I,^J> MEANS
THAT THE POINTER WILL NOW POINT TO ^A<^I,^J-^I> IF ^J ^G^E ^I, OR
TO ^A[1]<^I,36-^I> IF ^J<^I.  ^EXAMPLE: ^SUPPOSE THE MEMORY LOCATIONS STARTING AT ^S^T^G CONTAIN AN ^A^S^C^I^I STRING STORED FIVE
7-BIT CHARACTERS TO A WORD, WITH THE RIGHTMOST BIT EMPTY.
^THEN THE FOLLOWING PROGRAM FRAGMENT UNPACKS ^S^T^G INTO THE
LOCATIONS STARTING AT ^U^N^P, ONE CHARACTER PER WORD, RIGHTJUSTIFIED (REMEMBER, THE ^A^S^C^I^I STRING TERMINATES WITH A 0
CHARACTER):
.NOFILL
.LEFT MARGIN 25
.SKIP
^X__^B^Y^T^E^P ^S^T^G<7,36>; ^I__-1;
^L^O^O^P: (^U^N^P[^I__^I+1]__<+^X>)=>^G^O ^T^O ^L^O^O^P
.SKIP
.LEFT MARGIN 15
.FILL
^BYTE POINTERS MAY ALSO BE STORED INTO, WITH OR WITHOUT FIRST
BEING INCREMENTED: <+^X>__^I.
.SKIP 4
.SUBTITLE 2.2.7: ^INPUT/^OUTPUT.
.INDEX INPUT/OUTPUT
.INDEX FORMATTED ^I/^O
.INDEX ^^PRINT\\
.INDEX ^^READ\\
.CENTER
^&2.2.7: ^INPUT/^OUTPUT.\&
.SKIP 2
.INDENT -15
^P^R^I^N^T ^A,^B,^C
.INDENT -15
^R^E^A^D ^A,^B,^C
.BREAK
^A, ^B, ^C, ETC., ARE A LIST OF EXPRESSIONS TO BE TRANSFERRED
FROM/TO INPUT/OUTPUT FILES, WITH FORMAT SPECIFIERS MIXED
IN.  ^ANY EXPRESSION MAY APPEAR IN A ^P^R^I^N^T LIST; IF AN
EXPRESSION OTHER THAN A SIMPLE OR SUBSCRIPTED VARIABLE
APPEARS IN A ^R^E^A^D LIST THE EFFECT WILL BE TO READ INTO
A TEMPORARY LOCATION.  ^THE FORMAT SPECIFIERS ARE LISTED
BELOW.
.PARAGRAPH
^THE VALUE OF A ^P^R^I^N^T STATEMENT IS THE NUMBER OF THE
LAST COLUMN ON A LINE THAT WAS PRINTED INTO.  ^IN PARTICULAR, THE VALUE OF ^P^R^I^N^T / IS 0.  ^THE VALUE OF A ^R^E^A^D
STATEMENT IS -1 IF AN ATTEMPT HAS BEEN MADE TO READ PAST
THE END OF THE FILE, 1 IF AN ATTEMPT HAS BEEN MADE TO READ
PAST THE END OF A LINE, AND 0 OTHERWISE.
.PARAGRAPH
.INDEX OUTPUT FILE, DEFAULT
.INDEX INPUT FILE, DEFAULT
^IF NO FILE IS EXPLICITLY SPECIFIED, OUTPUT IS TO
FILE ^P^O AND INPUT IS FROM FILE ^P^I.
^THERE IS NO RULE AGAINST USING MANY STATEMENTS
TO PRINT OR READ ONE LINE; THE ONLY THING THAT TERMINATES
A LINE IS A /.  ^A FORMAT, ONCE SPECIFIED, REMAINS IN
                      EFFECT UNTIL ANOTHER SPECIFICATION IS ENCOUNTERED, EVEN
THROUGH SEVERAL DIFFERENT ^P^R^I^N^T OR ^R^E^A^D STATEMENTS.
^CHANGING THE ^P^R^I^N^T FORMAT OR FILE DOES NOT AFFECT THE ^R^E^A^D
FORMAT OR FILE, AND VICE VERSA.
.PARAGRAPH
^IN PRINTING, IF A DATA ITEM IS PRESENTED THAT
IS TOO LARGE FOR THE SPECIFIED FIELD WIDTH, A FIELD JUST
LARGE ENOUGH TO CONTAIN IT IS USED.  ^CONSEQUENTLY, IF A
FIELD WIDTH OF 0 IS SPECIFIED, A FIELD JUST LARGE ENOUGH
TO CONTAIN EACH DATA ITEM WILL BE USED.
.PARAGRAPH
^IN READING, IF THE FIELD WIDTH SPECIFICATION IS A SINGLE-CHARACTER
STRING (E.G., ','), THE INPUT FIELD WILL TERMINATE ON
THE FIRST OF A) THE SPECIFIED CHARACTER; B) THE END OF THE LINE;
C) 128 INPUT CHARACTERS.  ^A FIELD WIDTH SPECIFICATION OF 0 IS EQUIVALENT
TO ','.  ^BLANKS ARE IGNORED ON INPUT (EXCEPT IN ^^STG\\ CONVERSION
AND WHEN ' ' IS THE FIELD TERMINATOR).  ^TABS ARE CONVERTED TO A
SINGLE BLANK ON INPUT.  ^ALL FIELDS ARE LIMITED TO 128 CHARACTERS ON
INPUT.
.PARAGRAPH
^FIELD WIDTHS IN FORMAT SPECIFIERS ARE USUALLY
CONSTANTS BUT MAY BE ANY EXPRESSION.
.PARAGRAPH
^IT IS NECESSARY TO CLOSE OUT YOUR OUTPUT FILES EXPLICITLY IN YOUR PROGRAM SOME TIME BEFORE IT TERMINATES.
.INDEX ^F^I^N^I
.INDEX OUTPUT FILES, TERMINATING
.INDEX TERMINATING OUTPUT FILES
^THIS IS DONE BY THE SUBROUTINE CALL ^F^I^N^I(I), FOR I=0 OR
-1.  ^THIS CLOSES ALL YOUR FILES.  ^IF I=0, ^F^I^N^I EXITS TO
THE MONITOR; IF I=-1, ^F^I^N^I RETURNS NORMALLY.  ^YOU MAY ALSO
CALL ^F^I^N^I(^N^A,^E^X^T,^P^N,^P^J) WHERE ^N^A _& ^E^X^T ARE A SPECIFIC FILE
NAME AND EXTENSION IN ^A^S^C^I^I, AND ^P^N AND ^P^J ARE A PROGRAMMER AND PROJECT NUMBER.  ^THIS CAUSES ^F^I^N^I TO CLOSE OUT THE
SPECIFIC FILE NAMED AND RETURN NORMALLY.  ^IF ANY OF ^E^X^T,
^P^N OR ^P^J ARE ZERO, THE USUAL DEFAULT CASE IS ASSUMED.
.PARAGRAPH
^AT MOST FOUR FILES MAY BE REFERRED TO IN ^I^M^P ^I/^O.  ^IF
IT IS DESIRED TO REFER TO MORE, ONE OF THE PREVIOUS FILES
MUST BE EXPLICITLY CLOSED USING ^F^I^N^I (OR CLOSE ALL OF THEM
WITH ^F^I^N^I(-1)).
.SKIP
.INDENT -15
^FORMAT ^SPECIFIERS:
.SKIP
.INDEX FORMAT SPECIFICATIONS (^I/^O)
.INDENT -12
^I^G^R ^N
.BREAK
^CONVERSION IS IN BASE 10, IN A FIELD ^N POSITIONS WIDE.
^ON OUTPUT, LEADING ZEROS ARE SUPPRESSED, AND A LEADING
MINUS SIGN IS PRINTED FOR NEGATIVE NUMBERS.
.INDENT -12
^O^C^T ^N
.BREAK
^CONVERSION IS IN BASE 8, UNSIGNED (I.E., NEGATIVE NUMBERS
PRINT WITH LEADING 7'S), IN A FIELD ^N POSITIONS WIDE.  ^ON
OUTPUT, LEADING ZEROS ARE PRINTED.  ^IF ^N IS GREATER THAN
                      12, EXACTLY THE LEFTMOST ^N-12 POSITIONS WILL BE BLANK.
.INDENT -12
^S^T^G ^N
.BREAK
^CONVERSION IS IN ^A^S^C^I^I, IN A FIELD ^N WIDE.  ^ON OUTPUT,
IF ^N IS 0 CHARACTERS ARE PRINTED UNTIL A 0 BYTE IS
ENCOUNTERED.  ^OTHERWISE, CHARACTERS ARE PRINTED UNTIL
A 0 BYTE IS ENCOUNTERED OR UNTIL ^N CHARACTERS HAVE
BEEN PRINTED.
.INDENT -12
^^FLT M.N\\
.BREAK
^PRINTS A FLOATING POINT NUMBER IN A FIELD ^M COLUMNS WIDE, WITH ^N
DIGITS TO THE RIGHT OF THE DECIMAL POINT.  IF ^N IS 0, NO
DECIMAL POINT IS PRINTED.  ^IF THE NUMBER WILL NOT FIT IN THE FIELD
AS SPECIFIED, SCIENTIFIC NOTATION IS USED.
^IF ^M IS NEGATIVE, SCIENTIFIC NOTATION IS ALWAYS USED IN A
FIELD -^M COLUMNS WIDE.  (^^IMP\\ USES " TO MEAN
'TIMES 10 TO THE'.)    ^EXCEPTION: IF ^M IS 0,
A FIELD JUST WIDE ENOUGH TO CONTAIN THE NUMBER IS USED.  ^ON INPUT,
^^FLT M.N\\ IS EQUIVALENT TO ^^IGR M\\.
.INDENT -12
/
.BREAK
^NEW LINE.  ^ON OUTPUT, CAUSES TERMINATION OF THE CURRENT
LINE.  ^IF A LINE IS PRINTED BUT NOT TERMINATED WITH A /,
THEN THE LINE WILL NOT PRINT. ^SUCCESSIVE /'S PRODUCE BLANK
LINES.  ^ON INPUT, A / CAUSES THE REMAINDER OF THE CURRENT
LINE TO BE SKIPPED OVER.
.SKIP
.INDEX FILE SPECIFICATIONS
.INDENT -12
^F^I^L^E ^A
.INDENT -12
^F^I^L^E ^A.^B
.INDENT -12
^F^I^L^E ^A[^P,^R]
.INDENT -12
^F^I^L^E ^A.^B[^P,^R]
.BREAK
^SPECIFIES THE FILE FOR INPUT/OUTPUT.  ^A AND ^B ARE FILE
NAME AND EXTENSION, AND MAY BE EITHER ^A^S^C^I^I STRING CONSTANTS OR UNSUBSCRIPTED VARIABLES.  ^P AND ^R ARE PROJECT AND PROGRAMMER
NUMBERS.  ^IF THEY ARE CONSTANTS, THEY ARE INTERPRETED
CORRECTLY IF AND ONLY IF THEY ARE
WRITTEN IN OCTAL BUT WITHOUT THE LETTER "^B" SUFFIXED. ^IF THEY ARE
EXPRESSIONS, IT IS THE PROGRAMMER'S RESPONSIBILITY TO TAKE
INTO ACCOUNT THE FACT THAT PROJECT AND PROGRAMMER NUMBERS
ARE OCTAL.  ^CAUTION: ^F^I^L^E ^F^O^R03.^D^A^T, E.G., REFERS TO
VARIABLES ^F^O^R03 AND ^D^A^T.  ^HE WHO WROTE THIS PROBABLY MEANT
TO WRITE ^F^I^L^E '^F^O^R03'.'^D^A^T'.
.SKIP
^EXAMPLES: ^A__101^B; ^P^R^I^N^T ^S^T^G 1,^A,^I^G^R 4,^A,^O^C^T 6,^A,^A,/
PRODUCES THE LINE
.INDENT 5
.NOFILL
"^A  65000101000101"
.FILL
.BREAK
(^P^R^I^N^T ^I^G^R 3,^I)^F^O^R ^I ^T^O 2;^P^R^I^N^T /  PRODUCES THE
LINE
.INDENT 5
.NOFILL
"  0  1  2"
.NOFILL
.BREAK
^P^R^I^N^T ^S^T^G 0, '^THIS IS A ^PAGE ^HEADING',/ PRODUCES THE LINE
.INDENT 5
.NOFILL
"^THIS IS A ^PAGE ^HEADING".
.FILL
.SKIP
.INDEX DEVICE SPECIFICATION (^I/^O)
.INDENT -12
^D^E^V^I^C^E ^D
.BREAK
^CAUSES THE NEXT ^F^I^L^E SPECIFICATION (ON EITHER ^R^E^A^D
OR ^P^R^I^N^T) TO REFER TO A FILE ON DEVICE ^D.  ^D MAY BE
EITHER AN ^A^S^C^I^I STRING CONSTANT OR A VARIABLE CONTAINING
A STRING VALUE.  ^DEFAULT DEVICE IS '^D^S^K:'.
^I/^O TO THE TELETYPE IS A SPECIAL CASE.  ^THE TELETYPE IS
DESIGNATED AS THE ^I/^O DEVICE BY ^^DEVICE 'TTY:'\\, AND NO
SUBSEQUENT FILE SPECIFICATION.  ^THE NEXT FILE SPECIFICATION WILL
CAUSE THE INPUT OR OUTPUT TO REVERT TO THAT FILE.
^CAUTION: DEVICE SPECIFICATION WILL ONLY WORK FOR ^^TTY:\\ OR FOR
DIRECTORY DEVICES HAVING PHYSICAL RECORDS OF 128 WORDS, SUCH AS
DISK AND ^^DEC\\TAPE.
.SKIP
.INDENT -12
^I^M^A^G^E ^M^O^D^E
.BREAK
^THIS FORMAT SPECIFICATION CAUSES SUBSEQUENT DATA
TRANSFER TO BE IN UNFORMATTED MODE, TRANSFERRING
36-BIT WORDS BETWEEN THE FILE AND THE VARIABLES IN THE I/O
STATEMENT LIST.  ^MIXING ^I^M^A^G^E ^M^O^D^E AND OTHER FORMAT
SPECIFICATIONS IN READING OR WRITING THE SAME FILE
MAY PRODUCE ANOMALOUS RESULTS.
.SKIP
.INDEX ^T^A^B
.INDENT -12
^T^A^B ^N
.BREAK
^ON ^P^R^I^N^T ONLY, CAUSES THE NEXT CHARACTER OF OUTPUT
TO APPEAR IN COLUMN ^N (NUMBERING STARTING WITH 1).
^IF PRINTING HAS ALREADY GONE PAST COLUMN ^N, NO ACTION
IS TAKEN.
THAT LINE.
.SKIP
.INDENT -12
^^FILL \\'C'
.BREAK
^ON OUTPUT ONLY, CAUSES LEADING POSITIONS IN ALL FIELDS TO BE
PRINTED AS THE SPECIFIED CHARACTER INSTEAD OF BEING LEFT BLANK.
^THUS, FOR EXAMPLE, ^^FILL '0'\\ CAUSES LEADING ZEROS TO BE
PRINTED.  ^THIS SPECIFICATION, UNLIKE THE OTHERS, AFFECTS ALL
OUTPUT FILES, NOT JUST THE CURRENT ONE.
.SKIP
.LEFT MARGIN 0
.SKIP 4
.TEST PAGE 5
.SUBTITLE 2.2.8: ^DECLARATIONS; ^D^A^T^A AND ^R^E^M^O^T^E STATEMENTS.
.INDEX DECLARATIONS
.CENTER
^&2.2.8: ^DECLARATIONS; ^D^A^T^A AND ^R^E^M^O^T^E STATEMENTS.\&
.SKIP 2
.LEFT MARGIN 15
.INDEX ^^LET\\ STATEMENT
.INDENT -15
^^LET I=2R,A=3,BF=B[1]
.BREAK
^THE ^^LET\\ STATEMENT PROVIDES A CONVENIENT WAY OF DECLARING
SYNONYMS.  ^IT CONSISTS OF THE WORD ^^LET\\, FOLLOWED BY A LIST
OF SYNONYM DECLARATIONS OF THE FORM ^N=^V, WHERE ^N IS A NAME AND
^V IS A CONSTANT, OR A SIMPLE OR SUBSCRIPTED VARIABLE.  ^THE EFFECT
IS THAT ALL SUBSEQUENT APPEARANCES OF ^N IN THE PROGRAM WILL BE
INTERPRETED AS IF ^V HAD BEEN WRITTEN INSTEAD(*).
.FOOTNOTE 5
.SKIP
.LEFT MARGIN 5
.INDENT -5
------------
.INDENT -5
(*) ^^LET A=B\\ IS IN FACT JUST "SYNTACTIC SUGARING"
FOR THE SYNTAX STATEMENT ^^<ATOM> ::= A ::="B".\\
!
.SKIP
.INDENT -15
^A,^B ^A^R^E 3 ^L^O^N^G,^C^O^M^M^O^N
.INDENT -15
1^R ^I^S ^R^E^G^I^S^T^E^R
.INDENT -15
^F^O^O,3^R ^I^S ^R^E^L^E^A^S^E^D
.BREAK
^DECLARATIONS:  THE GENERAL FORM FOR A DECLARATION IS
A LIST OF NAMES, THEN A LIST OF CHARACTERISTICS
TO BE ASSOCIATED WITH THESE NAMES.
^THE CHARACTERISTICS AVAILABLE ARE:
.SKIP
.INDEX ^R^E^A^L
.INDENT -12
^R^E^A^L
.BREAK
^SPECIFIES THAT THE VARIABLES ARE REAL NUMBERS, AND ALL
ARITHMETIC PERFORMED ON THEM IS TO BE FLOATING POINT.
^TYPE CONVERSION BETWEEN REAL AND INTEGER IS ALWAYS
DONE IMPLICITLY.
.SKIP
.INDEX VECTOR DECLARATIONS
.INDEX ^L^O^N^G
.INDENT -12
N ^L^O^N^G
.BREAK
^WHERE N IS A CONSTANT OR CONSTANT EXPRESSION.  ^THE VARIABLES ARE DECLARED TO BE ARRAYS, AND N WORDS ARE RESERVED
FOR EACH OF THEM.  (^THE N WORDS MAY BE REFERRED TO AS
^A (OR ^A[0]), ^A[1], ... ^A[^N-1].)
.SKIP
.INDEX ^C^O^M^M^O^N DECLARATION
.INDEX ^^FORTRAN\\, COMPATIBILITY WITH
.INDENT -12
^C^O^M^M^O^N
.BREAK
^VARIABLES ARE MADE COMMON.  ^THEY ARE ASSUMED TO BE DEFINED
IN ANOTHER PROGRAM UNLESS THEY ARE DECLARED N ^L^O^N^G OR APPEAR AS A TAG IN
THIS PROGRAM, IN WHICH CASE THEY ARE DEFINED HERE.  (N MAY
BE 1 IF DESIRED.)   ^DECLARING A VARIABLE TO BE ^C^O^M^M^O^N WILL
MAKE IT THE SAME AS A ^F^O^R^T^R^A^N COMMON BLOCK WITH THAT NAME.
                      ^OTHER VARIABLES MAY BE LOCATED IN THAT BLOCK BY DEFINING
THE VARIABLES IN SYNTAX STATEMENTS OR ^^LET\\ STATEMENTS.
.SKIP
.INDENT -12
.INDEX ^^LOCAL\\ DECLARATION
^^LOCAL\\
.BREAK
^MAKES VARIABLES LOCAL TO THE CURRENT SUBROUTINE FROM THIS POINT
TO THE END OF THE SUBROUTINE, BUT DOES NOT AFFECT THE MEANING OF THE
IDENTIFIER OUTSIDE THE CURRENT SUBROUTINE.
^THIS DECLARATION IS ALSO USEFUL FOR MAKING LOCAL REGISTER
ASSIGNMENTS.
.SKIP
.INDEX ^^REGISTER\\
.INDENT -12
^^REGISTER\\
.BREAK
^IF ^A IS NOT AMONG 0^R-15^R, THE DECLARATION ^^A IS REGISTER\\
BINDS ^A TO A REGISTER SELECTED BY THE COMPILER, IN THE RANGE
1^R-13^R.  ^UNTIL THE DECLARATION ^^A IS RELEASED\\ IS ENCOUNTERED,
ALL REFERENCES TO ^A WILL BE REPLACED BY REFERENCES TO
THE REGISTER.  ^IF ^A IS A REGISTER NAME 0^R-15^R, THIS DECLARATION
WARNS THE COMPILER TO AVOID USING IT, BECAUSE THE PROGRAMMER INTENDS
TO USE IT.  ^IF THE REGISTER IS ALREADY IN USE, AN ADVISORY IS ISSUED.
.SKIP
.INDEX ^^RESERVED\\
.INDENT -12
^^RESERVED\\
.BREAK
^THIS DECLARATION PRECLUDES THE USE OF THE ASSOCIATED REGISTER BY
THE COMPILER UP TO THE END OF THE PROGRAM OR UNTIL A ^^RELEASED\\
OR ^^AVAILABLE\\ DECLARATION IS ENCOUNTERED.  ^^RESERVED\\ IS 
DISTINGUISHED FROM ^^REGISTER\\ IN THAT THE LATTER ONLY SHIELDS A
REGISTER FROM USE BY THE COMPILER UNTIL THE LAST TIME IT
IS REFERRED TO; ^^RESERVED\\ REMAINS IN EFFECT FOR THE ENTIRE SOURCE
PROGRAM.
.SKIP
.INDEX ^^AVAILABLE\\
.INDENT -12
^^AVAILABLE\\
.BREAK
^THIS DECLARATION INFORMS THE COMPILER THAT THE ASSOCIATED REGISTER
MAY BE USED BY IT FOR COMPUTATIONS.  ^IT DOES NOT AFFECT THE BINDING
BETWEEN AN IDENTIFIER AND A HARDWARE REGISTER, AND THE REGISTER WILL
BE RESERVED AGAIN BEGINNING AT THE NEXT REFERENCE TO IT.
.SKIP
.INDEX ^^RELEASED\\
.INDENT -12
^^RELEASED\\
.BREAK
^FOR IDENTIFIERS WHICH HAVE BEEN BOUND TO A HARDWARE REGISTER,
THAT BINDING IS TERMINATED, AND SUBSEQUENT REFERENCES TO THAT
IDENTIFIER WILL REFER TO A MEMORY LOCATION.  ^THE REGISTER BECOMES
AVAILABLE TO THE COMPILER.  ^FOR HARDWARE REGISTER NAMES,
^^RELEASED\\ IS EQUIVALENT TO ^^AVAILABLE\\.
.SKIP
.INDEX ^^SCRATCH\\
.INDENT -12
^^SCRATCH\\
.BREAK
^ORDINARILY, ALL REGISTERS WHICH ARE RESERVED AT THE POINT OF A
SUBPROGRAM CALL ARE SAVED BEFORE THE CALL AND RESTORED AFTERWARDS.
^THIS DECLARATION SIGNALS THE COMPILER NOT TO SAVE A REGISTER.
.SKIP
.INDEX ^^PROTECTED\\
.INDENT -12
^^PROTECTED\\
.BREAK
^THIS DECLARATION SIGNALS THE COMPILER TO PRESERVE THROUGH
SUBPROGRAM CALLS THE VALUE OF A REGISTER WHICH HAD PREVIOUSLY BEEN
DECLARED ^^SCRATCH\\.  ^^PROTECTED\\ IS THE DEFAULT MODE.
.SKIP 4
.INDEX ^^REMOTE\\
.INDENT -15
^R^E^M^O^T^E ^S
.BREAK
^S IS ANY STATEMENT.  ^HAS THE EFFECT OF CAUSING THE CODE
FOR STATEMENT ^S TO BE INSERTED NOT AT THE POINT IN THE
PROGRAM WHERE THE ^R^E^M^O^T^E STATEMENT APPEARS, BUT AT THE
END OF THE PROGRAM, JUST BEFORE THE CONSTANTS AND
VARIABLES.  ^USEFUL IN QUOTED SEMANTICS WHERE INITIALIZED
LOCAL VARIABLES ARE REQUIRED, E.G., ^L^O^C^A^L ^F^O^O ^I^N "...
^R^E^M^O^T^E ^F^O^O:^D^A^T^A(20); ...".
.SKIP
.INDEX ^D^A^T^A
.INDENT -15
^D^A^T^A (^L)
.BREAK
^L IS A LIST OF VARIABLE  NAMES AND CONSTANT EXPRESSIONS.  ^THE ^D^A^T^A
STATEMENT PRODUCES DATA WORDS AT THAT POINT IN THE PROGRAM
CONTAINING THE VALUES OF THE CONSTANT EXPRESSIONS, AND THE
ADDRESSES OF THE VARIABLES,
IN ^L.  ^ONE WORD IS USED FOR EACH ITEM IN ^L, EXCEPT THAT
^A^S^C^I^I STRINGS ARE STORED IN AS MANY WORDS AS ARE REQUIRED.
^D^A^T^A STATEMENTS MAY BE USED TO PRESET VARIABLES TO A VALUE
AT COMPILE TIME, VIZ.: ^V^A^R: ^D^A^T^A (3).  ^AVOID PUTTING ^D^A^T^A
STATEMENTS WHERE THEY MIGHT GET EXECUTED (UNLESS YOU
REALLY WANT TO EXECUTE YOUR DATA).
.SKIP 4
.SUBTITLE 2.2.9:  ^MISCELLANEOUS ^CONSTRUCTS.
.CENTER
^&2.2.9:  ^MISCELLANEOUS ^CONSTRUCTS.\&
.SKIP 2
.INDEX ^^CALL ME\\
.INDENT -15
^C^A^L^L ^M^E ^ISHMAEL
.BREAK
^ORDINARILY, THE NAME OF THE SOURCE FILE IS THE NAME WHICH ACTIVATES
THE ^^DDT\\ SYMBOL TABLE FOR A COMPILED ^^IMP72\\ PROGRAM.  ^THIS
STATEMENT OVERRIDES THAT NAME, AND ASSIGNS THE NAME ^ISHMAEL FOR
THAT PURPOSE.
.SKIP
.INDEX ^^EXECUTE\\
.INDENT -15
^E^X^E^C^U^T^E ^E
.BREAK
^EXECUTES THE INSTRUCTION CONTAINED IN THE
VARIABLE ^E.
.SKIP
.INDEX ^C^A^L^L^I
.INDENT -15
^C^A^L^L^I(^C,^V)
.BREAK
^EXECUTES THE ^D^E^CSYSTEM-10 ^^UUO CALLI C\\, WITH THE
^A^C VALUE ^V.  ^C MUST BE A CONSTANT LESS THAN 4096,
OR ELSE THIS CONSTRUCT WILL COMPILE AS A CALL TO
THE SUBROUTINE ^C^A^L^L^I (WHICH FORTUNATELY IS IN
THE LIBRARY PACKAGE ^F^O^R^T^I^O.^R^E^L - SEE ^SECTION 5).
^THE VALUE OF THIS CONSTRUCT IS THE ^A^C VALUE
RETURNED BY THE ^C^A^L^L^I.  ^IN ADDITION, IF THE ERROR
RETURN WAS TAKEN BY THE ^C^A^L^L^I, THE VARIABLE ^C^A^L^L^I
WILL HAVE BEEN SET TO -1 (BUT NOTE THAT IF THE
ERROR RETURN WAS NOT TAKEN, ITS PREVIOUS VALUE
WILL NOT HAVE BEEN CHANGED).
.SKIP
.INDEX ^X^W^D
.INDENT -15
^X^W^D ^A,^B
.BREAK
^USEFUL OCCASIONALLY IN SYSTEM CALLS.  ^HAS THE
VALUE ^B<^R> ^O^R ^A<^R> ^L^S 18.
.SKIP
.INDEX ^I^O^W^D
.INDENT -15
^I^O^W^D ^A,^B
.BREAK
^HAS THE VALUE ^X^W^D -^A,^B-1.
.SKIP
.INDEX ^^TWOSEG\\
.INDEX PURE CODE
.INDEX REENTRANT CODE
.INDENT -15
^T^W^O^S^E^G
.BREAK
^THIS STATEMENT WILL CAUSE REENTRANT (PURE) CODE
TO BE PRODUCED BY THE PROGRAM AT THE HEAD OF
WHICH IT APPEARS.  ^IT IS EQUIVALENT TO THE
COMPILER SWITCH /^R.  ^IT SHOULD BE THE VERY FIRST
STATEMENT IN THE SOURCE FILE.
.SKIP
.INDENT -15
^^FIX(A)\\
.BREAK
^HAS THE VALUE OF THE EXPRESSION ^A, CONVERTED TO TYPE INTEGER IF
IT WAS NOT ALREADY OF THAT TYPE.
.SKIP
.INDENT -15
^^FLT(A)\\
.BREAK
^HAS THE VALUE OF THE EXPRESSION ^A, CONVERTED TO TYPE REAL IF IT WAS
NOT ALREADY OF THAT TYPE.
.SKIP
.INDENT -15
^^MOVE A THROUGH N TO B\\
.BREAK
.INDEX BLOCK TRANSFERS
^GENERATES A BLOCK TRANSFER INSTRUCTION, WHICH EFFICIENTLY
PERFORMS THE OPERATION ^^(B[I]__A[I]) FOR I TO N\\.
^N IS ANY POSITIVE EXPRESSION (IF REAL, IT IS FIXED).
^A AND ^B ARE ANY EXPRESSIONS HAVING AN ADDRESS, SUCH AS
SIMPLE OR SUBSCRIPTED VARIABLES, OR [EXPRESSION].
.LEFT MARGIN 0
.SUBTITLE 2.3:  ^SYNTACTIC AND ^SEMANTIC ^EXTENSION.
.PAGE
.INDEX SYNTAX EXTENSION
.INDEX EXTENSION, SYNTACTIC
.INDEX SEMANTICS
.CENTER
^&2.3:  ^SYNTACTIC AND ^SEMANTIC ^EXTENSION.\&
.SKIP
.PARAGRAPH
^THIS SECTION EXPLAINS THE ^I^M^P72 FACILITIES FOR EXTENDING THE LANGUAGE.
^IT IS POSSIBLE TO ADD PRODUCTIONS TO THE SYNTAX FOR THE LANGUAGE, DEFINING THE
SEMANTICS FOR THE NEW CONSTRUCTS IN SEVERAL WAYS.  ^SEMANTICS MAY BE SPECIFIED
IN TERMS OF EXPRESSIONS WRITTEN IN THE PORTION OF THE LANGUAGE ALREADY DEFINED,
AS EXPLAINED IN ^SECTION 2.3.1.  ^ALTERNATIVELY, SEMANTICS MAY BE PERFORMED BY A
SERIES OF FUNCTION CALLS TO SEMANTIC SUBROUTINES CONTAINED WITHIN THE COMPILER,
AS DOCUMENTED IN ^SECTION 2.3.3.1.  ^THE USER MAY USE THE SUBROUTINES PROVIDED,
OR, IF HE REQUIRES OPERATIONS NOT AVAILABLE FROM THE CURRENT SET OF SEMANTIC
SUBROUTINES, HE MAY AS A LAST RESORT GO INTO THE COMPILER TO ADD NEW ONES.
^DIFFERENT SEMANTICS MAY BE SPECIFIED IN SPECIAL CASES, AS EXPLAINED IN ^SECTION
2.3.3.2, EITHER TO PERFORM DIFFERENT OPERATIONS UPON OBJECTS IN DIFFERENT
CONTEXTS, OR TO GENERATE BETTER OBJECT CODE.  ^WHEN THE SEMANTICS FOR SEVERAL
PRODUCTIONS ARE VERY SIMILAR, THEY MAY BE LUMPED TOGETHER UNDER A GENERAL
CASE, AS NOTED IN ^SECTION 2.3.3.3 AND 2.3.3.4.
.SKIP 4
.SUBTITLE 2.3.1:  ^THE ^EASY ^WAY - ^SYNTACTIC "^MACROS"
.CENTER
^&2.3.1:  ^THE ^EASY ^WAY - ^SYNTACTIC "^MACROS"\&
.INDEX SYNTACTIC MACROS
.INDEX MACROS, SYNTACTIC
.SKIP
.PARAGRAPH
^THIS SECTION IS AN INTRODUCTION TO SYNTACTIC EXTENSION IN ^I^M^P72 FOR THE
CASUAL USER, AND IS INTENDED TO PROVIDE HIM WITH SUFFICIENT INFORMATION TO
UTILIZE THE BASIC FACILITY WITHOUT INFORMING TO THE POINT OF TOTAL CONFUSION.
^SOME OF THESE FEATURES ARE IN FACT LESS RESTRICTED THAN INDICATED IN THIS
SECTION.  ^THE FULL TRUTH EMERGES IN SUBSEQUENT SECTIONS.
.PARAGRAPH
^I^M^P72 CONTAINS A FACILITY FOR DEFINING SYNTACTIC MACROS, OR PATTERNS
WHICH THE COMPILER WILL RECOGNIZE IN A PROGRAM AND GENERATE SPECIFIC CODE
FOR.  ^AN EXAMPLE OF A DEFINITION FOR THE ABSOLUTE VALUE FUNCTION USING A
SYNTACTIC MACRO IS
.SKIP
.INDENT 10
<^E^X^P> ::= ^A^B^S ( <^A> ) ::= "^A<0=>-^A ^E^L^S^E ^A"
.SKIP
^THIS STATEMENT, WHEN INSERTED IN A PROGRAM, WILL CAUSE THE COMPILER TO
RECOGNIZE THE CONSTRUCT ^A^B^S, FOLLOWED BY A "(", FOLLOWED BY ANY EXPRESSION,
FOLLOWED BY A ")", AND TO SUBSTITUTE FOR IT THE CODE ENCLOSED IN " SIGNS,
INSERTING THE ACTUAL EXPRESSION FOR EACH INSTANCE OF ^A IN THE QUOTED EXPRESSION.
^THUS, WRITING
.SKIP
.CENTER
^X__^A^B^S(^R+3)
.SKIP
LATER IN THE PROGRAM WOULD BE THE SAME AS WRITING
.SKIP
.CENTER
^X__(^R+3<0=>-(^R+3) ^E^L^S^E ^R+3)
.SKIP
.PARAGRAPH
.INDEX SYNTAX STATEMENT
.INDEX SYNTAX PART
.INDEX SEMANTIC PART
^A SYNTAX STATEMENT FITS THE FOLLOWING PATTERN:
.SKIP
.CENTER
<^E^X^P> ::= SYNTAX PART ::= SEMANTIC PART
.SKIP
.PARAGRAPH
^THE SYNTAX PART IS THE PATTERN WHICH THE COMPILER IS TO RECOGNIZE.  ^IT
CONSISTS OF THE NAMES AND SPECIAL SYMBOLS IN THE PATTERN, AND, FOR EACH EXPRESSION IN THE PATTERN, AN IDENTIFIER IN ANGLE BRACKETS: E.G., <^F^O^O>.  ^SINGLE
CHARACTERS IN QUOTES (E.G., '_#') ARE INTERPRETED AS THAT CHARACTER, WITHOUT THE
QUOTES, AND THE CHARACTERS : ; " < AND % MUST BE QUOTED IF THEY APPEAR IN THE
SYNTAX PART.
.PARAGRAPH
^THE SEMANTIC PART CONSISTS OF AN ^I^M^P EXPRESSION IN DOUBLE QUOTES, PERHAPS
.INDEX LOCAL VARIABLES
.INDEX ^L^O^C^A^L
PRECEDED BY A LIST OF LOCAL VARIABLES.  ^IT DEFINES THE CODE ^I^M^P IS TO GENERATE
WHEN IT RECOGNIZES AN INSTANCE OF THE SYNTAX PART, WITH THE ACTUAL EXPRESSIONS
IN THE INSTANCE TO BE INSERTED IN THE QUOTED EXPRESSION IN PLACE OF THE
IDENTIFIERS WHICH APPEARED IN ANGLE BRACKETS IN THE SYNTAX PART.
.PARAGRAPH
^THE QUOTED EXPRESSION MAY BE PRECEDED WITH A LIST OF LOCAL VARIABLES.
^FOR EXAMPLE, NOTICE THAT THE DEFINITION OF ^A^B^S ABOVE COMPUTES ^A TWICE, WHICH
MAY BE INEFFICIENT IF ^A IS AN EXPRESSION.  ^A MORE EFFICIENT WAY OF DOING IT
IS
.SKIP
.INDENT 5
<^E^X^P> ::= ^A^B^S ( <^A> ) ::= ^L^O^C^A^L ^R ^I^N "^R ^I^S ^R^E^G^I^S^T^E^R;
.INDENT 25
(^R__^A)<0=>-^R ^E^L^S^E ^R"
.SKIP
^THIS DEFINITION COMPUTES ^A ONLY ONCE, STORING IT TEMPORARILY IN THE REGISTER ^R.
.PARAGRAPH
^ANOTHER EXAMPLE IS TAKEN FROM THE SYNTAX BUILT INTO THE COMPILER:
.SKIP
<^E^X^P> ::= <^A> ^F^O^R <^B> ^F^R^O^M <^C> ::= ^L^O^C^A^L ^F^O^R ^I^N "^B__^C;
.INDENT 30
^F^O^R: ^A;
.INDENT 30
(^B__^B-1) ^G^E 0=>^G^O ^T^O ^F^O^R";
.SKIP
^THE LIST OF LOCAL VARIABLES MAY CONSIST OF UP TO TEN NAMES, SEPARATED BY
COMMAS.
.PARAGRAPH
^THIS CONCLUDES THE INTRODUCTION TO SYNTACTIC MACROS.
.SUBTITLE 2.3.2: ^SPECIFYING ^SYNTAX.
.PAGE
.CENTER
^&2.3.2: ^SPECIFYING ^SYNTAX.\&
.PARAGRAPH
.INDEX SYNTAX STATEMENT
^THE FORM OF THE SYNTAX SPECIFICATION STATEMENT IS A MODIFICATION OF THE FORM
OF A ^B^N^F PRODUCTION (^NAUR 1963), WITH ALTERNATIVE RIGHT-HAND SIDES NOT ALLOWED,
AND A SEMANTICS DEFINITION ADDED AT THE RIGHT.  ^THE GENERAL FORM IS:
.SKIP
.CENTER
<CLASS> ::= SYNTAX-PART ::= SEMANTIC-PART
.PARAGRAPH
^WE WILL USE THE TERM "ARGUMENTS" OF A PRODUCTION OR SYNTAX
STATEMENT TO REFER TO THE NON-TERMINALS APPEARING IN THE
SYNTAX-PART OF A SYNTAX STATEMENT (I.E., ON THE RIGHT-HAND
SIDE OF THE PRODUCTION).
.SKIP
.PARAGRAPH
^THE COMPILER INTERPRETS A PROGRAM BY RECOGNIZING INSTANCES OF CERTAIN
SYNTACTIC CLASSES, SUCH AS <^E^X^P> (EXPRESSION), <^V^B^L> (VARIABLE), ETC.  ^THE
FUNCTION OF THE SYNTAX PART OF A SYNTAX STATEMENT IS TO TELL THE COMPILER ABOUT
A NEW CONSTRUCT THAT IT MUST RECOGNIZE AS AN INSTANCE OF A CERTAIN CLASS,
SPECIFIED BY THE IDENTIFIER IN <CLASS>.  ^THE CLASSES OF INTEREST IN THE ^I^M^P
.INDEX SYNTACTIC CLASSES
LANGUAGE ARE:
.SKIP
.INDEX ^N^A^M^E
.INDEX ^I^O^N
.INDEX ^V^B^L
.INDEX ^A^T^O^M
.INDEX ^B^Y^T^E
.INDEX ^E^X^P
.INDEX ^S^T
.INDEX ^S^T^L
.LEFT MARGIN 15
.INDENT -10
<^N^A^M^E>:  ^ANY VARIABLE NAME OR CONSTANT.  ^SHOULD GENERALLY BE AVOIDED IN
FAVOR OF <^V^B^L> UNLESS THE USER IS SURE OF WHAT HE IS DOING.
.SKIP
.INDENT -10
<^V^B^L>:   ^ANY CONSTANT OR SIMPLE OR SUBSCRIPTED VARIABLE.
.SKIP
.INDENT -10
<^I^O^N>:   ^ANY <^V^B^L>, FUNCTION CALL, OR AN <^S^T^L> ENCLOSED IN PARENTHESES.
.SKIP
.INDENT -10
<^A^T^O^M>:  ^AN <^I^O^N> OR BYTE OF AN <^I^O^N>.
.SKIP
.INDENT -10
<^B^Y^T^E>:  ^ANY BYTE OR BYTE POINTER REFERENCE.
.SKIP
.INDENT -10
<^E^X^P>:   ^CLASS OF MOST EXPRESSIONS.
.SKIP
.INDENT -10
<^S^T>:    ^INCLUDES <^E^X^P>'S, CONDITIONAL EXPRESSIONS, DECLARATIONS, ETC.
.SKIP
.INDENT -10
<^S^T^L>:   ^LIST OF ONE OR MORE <^S^T>S, SEPARATED BY ;'S.
.LEFT MARGIN 0
.PARAGRAPH
^THE FULL SET OF SYNTACTIC CLASSES IN ^I^M^P MAY BE DETERMINED BY READING THE
SYNTAX OF THE LANGUAGE (SEE ^APPENDIX ^I^I).  ^THE USER MAY
DEFINE HIS OWN SYNTACTIC CLASSES AS THE HUMOR FALLS UPON HIM.
.PARAGRAPH
^THE SYNTACTIC PART OF A SYNTAX STATEMENT MAY CONTAIN:
.SKIP
.LEFT MARGIN 10
.INDENT -3
1. ^IDENTIFIERS AND SPECIAL CHARACTERS, REPRESENTING THEMSELVES.
^THE CHARACTERS %, ", :, < AND ; MUST BE ENCLOSED IN SINGLE QUOTES.
.SKIP
.INDENT -3
2. ^SINGLE CHARACTERS ENCLOSED IN SINGLE QUOTES.  ^THEY ARE INTERPRETED
AS THE CHARACTER ALONE.
.SKIP
.INDENT -3
3. ^SYNTACTIC CLASSES, REPRESENTED BY <^C^L^A^S^S,NAME>, WHERE ^C^L^A^S^S IS THE
NAME OF THE CLASS AND NAME IS AN IDENTIFIER BY WHICH TO REFER TO THIS
ARGUMENT OF THE PRODUCTION IN THE SEMANTICS.
.SKIP
.INDENT -3
4. <NAME>.  ^THIS IS INTERPRETED AS <^E^X^P,NAME> UNLESS IT IS THE VERY FIRST
THING AFTER THE ::=, IN WHICH CASE IT IS INTERPRETED AS <^A^T^O^M,NAME>.
^THIS HAS THE EFFECT OF MAKING OPERATIONS DEFINED USING <NAME> BE
RIGHT-ASSOCIATIVE, IN KEEPING WITH THE ^I^M^P CONVENTION.
.LEFT MARGIN 0
.PARAGRAPH
^EXAMPLE: ^IN SECTION 2.3.1, AN EXPURGATED VERSION OF THE SYNTAX OF ^F^R^O^M LOOPS
WAS GIVEN.  ^THE ADULT VERSION ILLUSTRATES THE USE OF SYNTACTIC CLASSES:
.SKIP
<^S^T> ::= <^E^X^P,^A> ^F^O^R <^V^B^L,^B> ^F^R^O^M <^E^X^P,^C> ::=
.INDENT 17
^L^O^C^A^L ^F^O^R ^I^N "^B__^C;
.INDENT 30
^F^O^R: ^A;
.INDENT 30
(^B__^B-1) ^G^E 0=>^G^O ^T^O ^F^O^R"
.PARAGRAPH
^THE INTERPRETATION OF THE SYNTACTIC PART OF THIS STATEMENT IS THAT THE COMPILER
IS HENCEFORTH TO RECOGNIZE AS AN <^S^T> THE CONSTRUCT CONSISTING OF ANY <^E^X^P>,
FOLLOWED BY THE WORD ^F^O^R, FOLLOWED BY ANY <^V^B^L>, FOLLOWED BY THE WORD ^F^R^O^M,
FOLLOWED BY ANY <^E^X^P>.
.PARAGRAPH
.INDEX RECURSIVE SYNTAX DEFINITION
.INDEX SYNTAX DEFINITION, RECURSIVE
^EXAMPLE: ^THIS EXAMPLE ILLUSTRATES THE USE OF USER-DEFINED SYNTACTIC CLASSES
AND RECURSIVE DEFINITIONS.  ^THE CONSTRUCT TO BE DEFINED IS ^G^O ^T^O (^L0,^L1,..,^L^N) ^I
WHICH TRANSFERS CONTROL TO ^LI WHERE I IS THE VALUE OF ^I.  (^IF ^I<0 OR ^I>^N, THE
EFFECT IS UNDEFINED.)
.SKIP
.NOFILL
.LEFT MARGIN 5
<^S^T> ::= ^G^O ^T^O (<^G^O^L^I^S^T,^A>) <^B>  ::=
           ^L^O^C^A^L ^G^O ^I^N "^G^O ^T^O ^G^O[^B];^G^O: ^A";
<^G^O^L^I^S^T> ::= <^N^A^M,^A>             ::= "^G^O ^T^O ^A";
<^G^O^L^I^S^T> ::= <^G^O^L^I^S^T,^A>,<^N^A^M,^B>  ::= "^A; ^G^O ^T^O ^B"
.SKIP
.INDENT -5
^THEN THE EXPRESSION
.SKIP
^G^O ^T^O (^A,^B,^C) ^J-3
.SKIP
.INDENT -5
PRODUCES
.SKIP
^G^O ^T^O %^G^O1[^J-3];
%^G^O1: ^G^O ^T^O ^A;
     ^G^O ^T^O ^B;
     ^G^O ^T^O ^C
.SKIP
.FILL
.LEFT MARGIN 0
(%^G^O1 IS A UNIQUE NAME GENERATED BY THE COMPILER FOR THE LOCAL VARIABLE ^G^O.)
^THIS EXAMPLE DEPENDS ON THE FACT THAT A ^G^O ^T^O ^V GENERATES EXACTLY ONE MACHINE
WORD OF CODE IF ^V IS A VARIABLE.
.PARAGRAPH
^IT IS POSSIBLE TO WRITE A SYNTAX STATEMENT WITH NO SEMANTIC PART:
.SKIP
.CENTER
<CLASS> ::= SYNTAX-PART
.SKIP
^THE SEMANTICS IMPLIED BY THIS SYNTAX STATEMENT IS TO DISCARD ALL ARGUMENTS OF
THE PRODUCTION EXCEPT THE FIRST.  ^IF THERE ARE NO ARGUMENTS OR ONE ARGUMENT,
NO INFORMATION IS LOST.
.SUBTITLE 2.3.3: ^SPECIFYING ^SEMANTICS.
.PAGE
.CENTER
^&2.3.3: ^SPECIFYING ^SEMANTICS.\&
.SKIP 2
.SUBTITLE 2.3.3.1: ^SEMANTIC ^ROUTINES.
.INDEX SEMANTICS
.INDEX SEMANTIC ROUTINES, ARGUMENTS OF
.INDEX SEMANTIC ROUTINES
.CENTER
^&2.3.3.1: ^SEMANTIC ^ROUTINES.\&
.SKIP
.PARAGRAPH
^IN ^SECTION 2.3.1 WE SAW THAT THE SEMANTIC PART OF A SYNTAX STATEMENT COULD
CONSIST OF QUOTED SEMANTICS - I.E., AN ^I^M^P EXPRESSION ENCLOSED BY DOUBLE QUOTES.
^THERE IS ONE ALTERNATE FORMAT FOR SEMANTICS: A FUNCTIONAL EXPRESSION CONSISTING
OF CALLS TO SEMANTIC SUBROUTINES.
.PARAGRAPH
^SEMANTIC SUBROUTINES ARE NORMAL COMPILER SUBROUTINES WHICH ARE ALSO AVAILABLE TO THE SYNTAX WRITER IN A LIMITED SENSE.  ^THEY ARE CALLED WITH ARGUMENTS
OF THE FOLLOWING TYPES:
.LEFT MARGIN 10
.SKIP
.INDENT -3
1. ^CONSTANTS.  ^USUALLY SMALL POSITIVE NUMBERS.  ^THESE CAN SPECIFY
OPCODES, SWITCHES, OR WHATEVER, DEPENDING ON THE ROUTINE.
.SKIP
.INDENT -3
2. ^NEGATIVE DIRECTORY INDICES.  ^IDENTIFIERS ARE, BY CONVENTION, PASSED
TO SEMANTIC ROUTINES AS THE NEGATIVE OF THEIR INDEX IN THE
DIRECTORY.
.SKIP
.INDENT -3
3. ^REGISTERS.  ^THESE ARE IN THE FORM OF INDICES IN A TABLE OF SYMBOLIC
REGISTERS.  ^ASSIGNMENTS TO ACTUAL MACHINE REGISTERS ARE MADE DURING
THE ASSEMBLY PHASE.
.SKIP
.INDENT -3
4. ^OBJECTS.
.INDEX OBJECTS (SEMANTIC ROUTINE ARGUMENTS)
.SKIP
.INDENT -3
5. ^TWO ARGUMENTS CONNECTED BY A + SIGN.  ^THE VALUE IS THE SUM OF
THE ARGUMENTS.  A SYNTACTIC AMBIGUITY DIAGNOSTIC WILL RESULT FROM
AN ARGUMENT OF THE FORM ARG+ARG+ARG; THE DIAGNOSTIC MAY BE IGNORED.
.LEFT MARGIN 0
.PARAGRAPH
^OBJECTS ARE POINTERS INTO A STACK WHICH HOLDS THE EXPRESSIONS
BEING PROCESSED BY THE SEMANTICS OF THE CURRENT PRODUCTION.  ^AN
OBJECT CORRESPONDS TO SOME <CLASS,NAME> IN THE PRODUCTION AN INSTANCE
OF WHICH IS BEING COMPILED.  ^OBJECTS EITHER ARE IDENTIFIERS FROM THE
PROGRAM BEING COMPILED, OR HAVE BEEN CONSTRUCTED BY SEMANTICS OPERATING ON AND/OR COMBINING OTHER OBJECTS.
.PARAGRAPH
^OBJECTS COME IN FIVE FLAVORS: ^NAME, ^REGISTER, ^CONSTANT, ^VARIABLE AND ^MEMORY:
^ALL BUT ^NAME WILL HAVE AN ARITHMETIC TYPE (REAL OR INTEGER), AND MAY HAVE
ASSOCIATED WITH THEM SOME OBJECT CODE WHICH COMPUTES THE EXPRESSION OF WHICH
THE OBJECT IS THE VALUE.
.LEFT MARGIN 10
.SKIP
.INDENT -5
^NAME - ^HAS NO PROPERTIES OTHER THAN A NAME.  ^IS TURNED INTO ANOTHER TYPE
OF OBJECT BY SEMANTIC ROUTINE ^N^A^M^E (Q.V.).  ^NAMES WILL NOT POP UP AS
OPERANDS; THEY WILL HAVE BEEN PASSED THROUGH ^N^A^M^E ON THEIR WAY TO
BECOMING <^V^B^L>S.
.SKIP
.INDENT -5
^REGISTER - ^HAS NO PROPERTIES OTHER THAN A REGISTER.  ^A ^REGISTER OBJECT
USUALLY DESIGNATES A REGISTER HOLDING THE RESULT OF A COMPUTATION.
.SKIP
.INDENT -5
^CONSTANT - ^MAY BE A CONSTANT FROM THE SOURCE PROGRAM (IN WHICH CASE IT HAS
A NAME), OR A COMPUTED ONE.  ^IN ANY EVENT, IT HAS A VALUE.
.SKIP
.INDENT -5
^VARIABLE - ^DESIGNATES A SIMPLE VARIABLE, WITH MAYBE A CONSTANT SUBSCRIPT.
           ^NO OTHER PROPERTIES.
.SKIP
.INDENT -5
^MEMORY - ^DESIGNATES SOME ADDRESS IN MEMORY TOO COMPLICATED TO BE A
^VARIABLE.  ^MAY HAVE ANY OR ALL OF A NAME, A CONSTANT SUBSCRIPT, AN
INDEX REGISTER (CONTAINING THE VALUE OF A COMPUTED SUBSCRIPT), AND
EVEN AN INDIRECT BIT.
.LEFT MARGIN 0
.SKIP 4
.SUBTITLE 2.3.3.1.1: ^CALLING ^CONVENTIONS FOR ^SEMANTIC ^ROUTINES.
.PAGE
.INDEX SEMANTIC ROUTINES, ARGUMENTS OF
.CENTER
^&2.3.3.1.1: ^CALLING ^CONVENTIONS FOR ^SEMANTIC ^ROUTINES.\&
.SKIP
.PARAGRAPH
^THE SEMANTIC PART OF A SYNTAX STATEMENT MAY CONSIST OF A CALL TO A SEMANTIC
ROUTINE, IN STANDARD ^I^M^P SUBROUTINE CALL FORMAT.  ^THE ARGUMENTS OF THE CALL MAY
BE EITHER:
.LEFT MARGIN 10
.SKIP
.INDENT -3
1. ^CONSTANTS, UNSIGNED, LESS THAN 30 BITS.  ^THE ARGUMENT PASSED TO THE
SEMANTIC ROUTINE IS THAT NUMBER.
.SKIP
.INDENT -3
2. ^IDENTIFIERS APPEARING AS NAMES OF INSTANCES OF CLASSES IN THE
PRODUCTION (E.G., ^A IN THE EXAMPLE OF ^SECTION 2.3.1).  ^THE ARGUMENT
PASSED TO THE SEMANTIC ROUTINE IS A "STACK POINTER" TO THE OBJECT
RECOGNIZED AS THAT PART OF THE PRODUCTION.
.SKIP
.INDENT -3
3. ^IDENTIFIERS NOT APPEARING AS NAMES OF INSTANCES OF CLASSES.  ^THE
ARGUMENT PASSED TO THE SEMANTIC ROUTINE IS THE NEGATIVE OF THE DIRECTORY INDEX OF THE NAME.
.SKIP
.INDENT -3
4. ^ANOTHER CALL TO A SEMANTIC ROUTINE.  ^THE ARGUMENT PASSED IS THE VALUE
OF THE SEMANTIC ROUTINE.
.SKIP
.INDENT -3
5. ^ANY TWO OF THE ABOVE CONNECTED BY A + SIGN.  ^THE ARGUMENT PASSED IS
THE INDICATED SUM.
.LEFT MARGIN 0
.PARAGRAPH
^ALTHOUGH A SEMANTIC PART CONSISTING OF CALLS ON SEMANTIC ROUTINES LOOKS LIKE
PART OF AN ^I^M^P PROGRAM, THERE ARE CERTAIN CONVENTIONS WHICH THE SEMANTICS WRITER
MAY TAKE ADVANTAGE OF HERE.  ^SEMANTIC ROUTINES MAY HAVE UP TO 10 ARGUMENTS.
^ARGUMENTS ARE EVALUATED STRICTLY LEFT TO RIGHT WITHIN ONE FUNCTION CALL.  ^IF
MORE OR FEWER ARGUMENTS ARE PROVIDED THAN THE ROUTINE DEMANDS, NO DIFFICULTY IS
ENCOUNTERED (EXCEPT THAT A REFERENCE TO A MISSING ARGUMENT WILL REFER TO A
RANDOM LOCATION IN USER CORE).
.PARAGRAPH
^THEREFORE, ALTHOUGH THE ";" OPERATOR IS NOT PROVIDED IN THE SYNTAX FOR
SEMANTIC ROUTINE CALLS, ITS EFFECTS OFTEN CAN BE ACHIEVED THROUGH THE USE OF
ARGUMENTS WHICH WILL BE EVALUATED BUT NOT USED.  ^FOR EXAMPLE, THE EFFECT OF
.SKIP
.CENTER
^F(^A,^B); ^G(^C,^D,^E)
.SKIP
MAY BE OBTAINED BY
.SKIP
.CENTER
^G(^C,^D,^E,^F(^A,^B))
.SKIP
IF IT DOES NOT MATTER THAT IN THE LATTER CASE ^C, ^D AND ^E ARE EVALUATED FIRST.
.PARAGRAPH
^THE FOLLOWING IS AN EXAMPLE OF A SYNTAX STATEMENT USING SEMANTIC
SUBROUTINES TO SPECIFY SEMANTICS.  ^IT IS SUGGESTED THAT THE
READER INTERPRET THE SEMANTIC ROUTINE CALLS USING THE TABLE BELOW.  214^B IS THE
^P^D^P-10 OPCODE FOR ^MOVE ^MAGNITUDE.
.SKIP
.CENTER
<^A^T^O^M>::= ^A^B^S ( <^A^T^O^M,^A> ) ::= ^D^E^W^O^P(214^B,^A^R^E^G1(1,15^B),^A);
.SUBTITLE 2.3.3.1.2: ^TABLE OF ^SEMANTIC ^ROUTINES
.PAGE
.INDEX SEMANTIC ROUTINES, TABLE OF
.CENTER
^&2.3.3.1.2: ^TABLE OF ^SEMANTIC ^ROUTINES\&
.SKIP
.PARAGRAPH
^IN THIS TABLE, THE TYPES OF ARGUMENTS EXPECTED ARE INDICATED AS FOLLOWS:
.SKIP
.LEFT MARGIN 30
.INDENT -20
^S, ^T, ^U:   ^OBJECTS (OTHER THAN ^NAMES EXCEPT WHERE SPECIFIED).
.INDENT -20
^R, ^P   :   ^REGISTERS.
.INDENT -20
^I, ^J, ^N:   ^CONSTANTS OR (WHEN SPECIFIED) NEGATIVE DIRECTORY INDICES.
.SKIP
.INDENT -20
* ^INDICATES A ROUTINE WHICH IS OBJECT MACHINE-DEPENDANT (I.E., WHICH MUST
BE ALTERED IF CODE FOR ANOTHER COMPUTER IS TO BE GENERATED.)
.LEFT MARGIN 18
.SKIP
.INDENT -18
^N^A^M^E ^A^N^D ^A^R^G^U^M^E^N^T^S      ^E^F^F^E^C^T ^A^N^D ^R^E^S^U^L^T ^R^E^T^U^R^N^E^D.
.INDEX ^^ADDOP\\
.SKIP
.INDENT -18
^A^D^D^O^P(^I,^S,^T)
.BREAK
*^PERFORMS A BINARY OPERATION ON ^S AND ^T.  ^IT IS DEFINED AS
^H^O^O^K(^S,^T, ^D^E^W^O^P(^I,^R^E^G^O^F(^F^E^T^C^H(^T)),^S)).  ^THIS COULD BE WRITTEN
IN SEMANTICS BUT USING ^A^D^D^O^P SAVES COMPILER TABLE SPACE AND
IS CLEARER BESIDES.
.SKIP
.INDENT -18
^A^D^D^R(^S)
.BREAK
*^MAKES ^S A ^MEMORY-TYPE OBJECT WHOSE ADDRESS IS WHAT WAS PREVIOUSLY ITS VALUE.  ^THE USE OF THIS IS THAT WHEREAS
^D^E^W^O^P(^I,^R,^S) COMPILES AN INSTRUCTION WITH THE ADDRESS OF ^S IN
THE ADDRESS FIELD, ^D^E^W^O^P(^I,^R,^A^D^D^R(^S)) COMPILES AN INSTRUCTION
WITH THE VALUE OF ^S IN THE ADDRESS FIELD.  ^EXAMPLE:
<^E^X^P> ::= <^A^T^O^M,^I> ^L^S <^E^X^P,^J> ::= ^A^D^D^O^P(242^B,^A^D^D^R(^J),^I)
^A^D^D^R IS SMART ENOUGH TO TAKE ANY OBJECT (EXCEPT ^NAMES) AS ^S.
^RESULT OF ^A^D^D^R IS ^S.
.SKIP
.INDENT -18
^A^R^E^G(^I)
.BREAK
 ^RETURNS THE REGISTER INDEX FOR HARDWARE REGISTER ^I.
.INDEX ^^AREG1\\
.SKIP
.INDENT -18
^A^R^E^G1(^I,^J)
.BREAK
 ^RETURNS A BRAND-NEW REGISTER BETWEEN REGISTERS (^I ^A^N^D 37^B) AND
(^J ^A^N^D 37^B) INCLUSIVE.  ^IF ^I HAS THE 40^B BIT SET, THE REGISTER
IS THE RETURNED VALUE OF A SUBROUTINE AND MAY BE MOVED TO MAKE
ROOM FOR ANOTHER SUCH.  ^IF ^J HAS THE 40^B BIT SET, RESERVE TWO
CONSECUTIVE REGISTERS AND RETURN THE FIRST (SEE ALSO ^R^E^G2). ^IF
^I HAS THE 100^B BIT SET, THIS REGISTER IS TALKED ABOUT EXPLICITLY BY THE USER AND HE DOESN'T WANT ANY OLD COMPILER GOING
AROUND ALTERING ITS VALUE IMPLICITLY.
.SKIP
.INDENT -18
^B^Y^T^E^P(^S,^T,^U)
.BREAK
*^S IS A ^VARIABLE-TYPE OBJECT.  ^MAKES A BYTE POINTER FOR ^S<^T,^U>,
AND PUTS IT OFF AT THE END OF THE PROGRAM WITH ^R^E^M^O^T^E (Q.V.).
^RESULT IS ^S, WHOSE VALUE IS NOW THE (VARIABLE CONTAINING THE)
BYTE POINTER.  ^GOOD THINGS TO ^D^E^W^O^P ON ^S ARE BYTE
INSTRUCTIONS.
.SKIP
.INDENT -18
^C^O^N^O^P(^S,^T,^I,^U)
.BREAK
 ^PERFORMS AN OPERATION DESIGNATED BY ^I ON TWO ^CONSTANT-TYPE
OBJECTS ^S AND ^T.  ^SEE FILE ^S^Y^N^T^A^X OR THE SOURCE FOR ^C^O^N^O^P
FOR THE CODES FOR ^I.  ^FEEL FREE TO ADD A FEW MORE OPERATIONS
IF IT WILL GENERATE BETTER CODE.  ^U IS THE IMPLICAND IN CASES
OF ^C^O^N ^R^E^L^O^P ^C^O^N=>^U.  ^RESULT IS ^S, WITH CODE FOR ^T HOOKED IN
FIRST IF THERE IS ANY.
.SKIP
.INDENT -18
^^COPY(S)\\
.BREAK
^PRODUCES A COPY OF THE OBJECT ^S, INCLUDING A COPY OF THE CODE
ASSOCIATED WITH IT, IF ANY.  ^USEFUL IF ^S IS TO BE HOOKED IN IN
TWO DIFFERENT PLACES IN CODE TO BE GENERATED.  ^CARE MUST BE TAKEN
TO USE THE COPY OF ^S IN THE PLACE WHICH IS HOOKED IN FIRST, SINCE
TRYING TO COPY AN OBJECT THAT HAS ALREADY BEEN HOOKED IN MAY
IMPERIL THE INTERNAL TRANQUILITY OF THE COMPILER.
.SKIP
.INDENT -18
^D^A^T^A^S^T(^S)
.BREAK
 ^FOR USE IN ^D^A^T^A STATEMENTS.  ^S IS ANY OLD OBJECT; IT GETS
CLOBBERED.  ^UNPACKS THE CURRENT LIST (SEE ^E^N^L^I^S^T), AND
GENERATES CODE FOR THE ^D^A^T^A STATEMENT WHOSE CONSTANTS AND
VARIABLES ARE IN THE LIST.
.SKIP
.INDENT -18
^D^E^C^L
.INDENT -18
^D^E^C^L^A^R^E
.BREAK
 ^SPECIAL SEMANTIC ROUTINES TO IMPLEMENT DECLARATIONS.
.SKIP
.INDENT -18
^D^E^W^F^U^N(^S,^I,^J)
.BREAK
^ADDS THE CODE TO THE OBJECT ^S WHICH INSTRUCTS THE ASSEMBLY PASS
TO PERFORM SPECIAL FUNCTION ^I, WITH ARGUMENT ^J.
.SKIP
.INDEX ^D^E^W^O^P
.INDENT -18
^D^E^W^O^P(^I,^R,^S)
.BREAK
*^PERFORMS MACHINE OPCODE ^I UPON OBJECT ^S AND (IF NONZERO)
REGISTER ^R.  ^THIS IS A VERY SMART ROUTINE AND IS HAPPY WITH
ANY OBJECT (EXCEPT A ^NAME) AS ^S.  ^IF POSSIBLE, IT WILL
USE AN IMMEDIATE INSTRUCTION FOR CONSTANT OPERANDS.  ^CAUTION:
^IF ^D^E^W^O^P IS USED TO IMPLEMENT A BINARY OPERATOR (AS IN
^D^E^W^O^P(^O^P,^R^E^G^O^F(^T),^S), THE CODE FOR ^T MUST BE HOOKED ON TO THE
CODE FOR ^S AFTER THE ^D^E^W^O^P IS PERFORMED, OTHERWISE IT WILL BE
LOST.  ^SEE ^A^D^D^O^P.  ^RESULT OF ^D^E^W^O^P IS ^S.  ^IF ^R IS NONZERO, ^S
IS NOW A ^REGISTER OBJECT, WITH VALUE IN THE REGISTER DESIGNATED BY ^R.  ^NORMALLY, IF THE RESULT OF THE INSTRUCTION GENERATED
IS TO DESTROY, AS A SIDE-EFFECT, THE VALUE IN ^R, AND
^R IS A USER-SPECIFIED REGISTER (AS IN THE EXPRESSION
5^R ^L^S 8), A MOVE IS INSERTED TO GET THE VALUE OF ^R
INTO A SCRATCH REGISTER FIRST.  ^THIS MOVE MAY BE
		  SUPPRESSED BY ADDING 1000^B TO THE OPCODE ^I.
.SKIP
.INDENT -18
^E^N^L^I^S^T(^S)
.BREAK
 ^PLACES THE OBJECT ^S AT THE BOTTOM OF THE CURRENT LIST.  ^E^N^L^I^S^T
IS PART OF A GENERAL RECURSIVE LIST MECHANISM FOR STACKING UP
LISTS OF THINGS TO BE FED ALL AT ONCE TO SOME SEMANTIC ROUTINE.  ^N^E^W^L^I^S^T(^S) CREATES AN EMPTY LIST, AND, IF ^S IS NONZERO,
PUTS THE OBJECT ^S ON IT.  ^G^E^T^L^I^S^T(^S) IS A NON-SEMANTIC SUBROUTINE WHICH UNPACKS THE CURRENT LIST ON A FIRST-IN-FIRST-OUT
BASIS.  ^IF THE LIST IS NOT EMPTY, ^G^E^T^L^I^S^T(^S) PUTS THE TOP
OBJECT INTO THE OBJECT ^S (CLOBBERING THE OLD VALUE), AND RETURNS A NON-ZERO VALUE.  ^IF THE LIST IS EMPTY, ^G^E^T^L^I^S^T RETURNS
0, AND REOPENS THE LIST WHICH WAS CURRENT AT THE LAST CALL TO
^N^E^W^L^I^S^T.  ^SEE ^D^E^C^L^A^R^E (FILE ^I^M^P^S^E^M) FOR AN EXAMPLE OF A SEMANTIC ROUTINE WHICH USES ^G^E^T^L^I^S^T.  ^THE RESULT OF ^E^N^L^I^S^T IS 0.
.SKIP
.INDENT -18
^E^N^S^T^A^C^K(^I)
.BREAK
 ^CREATES AN OBJECT OF TYPE ^NAME, WHERE ^I IS THE DIRECTORY INDEX
(EITHER POSITIVE OR NEGATIVE) OF THE NAME.  ^FOR EXAMPLE TO
MAKE THE OBJECT CORRESPONDING TO THE VARIABLE ^V^A^R, WRITE
^N^A^M^E(^E^N^S^T^A^C^K(^V^A^R)).
.SKIP
.INDENT -18
^E^R^R^O^R(^N,^V)
.BREAK
^PRODUCES THE COMPILER ERROR MESSAGE WHICH IS THE NAME
OF THE VARIABLE ^V.  ^N IS 0, 1 OR 2 FOR A FATAL, ORDINARY,
OR ADVISORY ERROR RESPCTIVELY.  ^FOR ERROR MESSAGES
CONTAINING SPACES, ETC., ENCLOSE THE MESSAGE IN ! SIGNS
TO MAKE IT INTO A VARIABLE NAME.  ^EXAMPLE:
^E^R^R^O^R(2,!^YOU ^GOOFED.!).
.SKIP
.INDEX ^F^E^T^C^H
.INDENT -18
^F^E^T^C^H(^S)
.BREAK
*^FORCES THE OBJECT ^S TO BE OF TYPE ^REGISTER (I.E., LOADS IT
INTO A REGISTER).  ^RESULT IS ^S.
.SKIP
.INDENT -18
^F^E^T^C^H2(^S)
.BREAK
*^FORCES THE OBJECT ^S TO BE OF TYPE ^REGISTER, WHEN DOUBLE
REGISTERS ARE BEING USED. ^DOES A FETCH INTO THE FIRST
REGISTER OF A NEWLY RESERVED REGISTER PAIR UNLESS ^S IS
PROGRAMMER-DEFINED REGISTER, IN WHICH CASE NOTHING IS
DONE. ^RESULT IS ^S.
.SKIP
.INDENT -18
^F^I^X(^S)
.BREAK
*^GENERATES CODE TO CONVERT ^S FROM FLOATING POINT TO INTEGER.
^VALUE IS ^S.
.SKIP
.INDENT -18
^F^L^O^A^T(^S)
.BREAK
*^GENERATES CODE TO CONVERT ^S FROM INTEGER TO FLOATING POINT.
^VALUE IS ^S.
.SKIP
.INDENT -18
^F^R^E^E^Z^E(^S)
.BREAK
 ^FLAGS THE CODE ASSOCIATED WITH ^S SO THAT THE ASSEMBLY PHASE
                  WILL NOT OPTIMIZE OUT ANY ^M^O^V^E INSTRUCTIONS IN IT.  ^USEFUL
WHEN GENERATING SKIP INSTRUCTIONS.  ^RESULT IS ^S.
.SKIP
.INDEX ^H^O^O^K
.INDENT -18
^H^O^O^K(^U,^S,^T)
.BREAK
 ^HOOKS THE CODE FOR ^T ON AFTER THE CODE FOR ^S.  ^U GETS THIS
CODE, AND THE VALUE OF ^T.  ^U MAY BE ONE OF ^S OR ^T (AND USUALLY
IS).  ^H^O^O^K THUS PERFORMS THE ";" OPERATOR, AMONG ITS OTHER
USES.  ^IT MUST BE USED WHENEVER TWO OR MORE ARGUMENTS WHICH
MIGHT HAVE CODE ATTACHED APPEAR IN A PRODUCTION, EXCEPT IN
THE FEW CASES WHERE ANOTHER SEMANTIC ROUTINE INVOKES ^H^O^O^K
IMPLICITLY.  ^THE RESULT OF ^H^O^O^K IS ^U.
.SKIP
.INDENT -18
^M^A^X^W^E^L^L
.INDENT -18
^M^A^X^E^N^D
.BREAK
 ^SPECIALIZED SUBROUTINES TO HANDLE THE JOB OF SWITCHING PARSER
OUTPUT INTO A TEMPORARY ARRAY RATHER THAN FEEDING IT TO THE
CODE GENERATOR.  ^USED TO IMPLEMENT QUOTED SEMANTICS.
.SKIP
.INDENT -18
^N^A^M^E(^S)
.BREAK
 ^S IS A ^NAME-TYPE OBJECT.  ^N^A^M^E TURNS IT INTO A VARIABLE,
ADDING AN ARITHMETIC TYPE, AND MAKING THINGS RIGHT IF ^S IS
A REGISTER OR SUBROUTINE PARAMETER.  ^RESULT IS ^S.
.SKIP
.INDENT -18
^N^E^W^L^I^S^T(^S)
.BREAK
 ^SEE ^E^N^L^I^S^T.
.SKIP
.INDENT -18
^O^J^U^M^P^O^P(^I)
.BREAK
*^I IS AN ^M-FIELD FOR A 300-SERIES OPCODE (CONDITIONAL) ON THE
^P^D^P-10.  ^THUS ^I SPECIFIES A RELATIONAL OPERATOR.  ^O^J^U^M^P^O^P
RETURNS THE ^M-FIELD FOR THE NEGATION OF THAT OPERATOR.  ^IF
^I HAS THE 10^B BIT SET, ^O^J^U^M^P^O^P RETURNS THE ^M-FIELD FOR THE
REVERSE NEGATION (THE REVERSE OF >, FOR EXAMPLE, IS <.)
.
.SKIP
.INDENT -18
^P^A^R(^I)
.BREAK
 ^USED IN ^C^A^S^E SEMANTICS TO REFER TO THE ^ITH ARGUMENT (COUNTING
FROM 0) OF THE ^C^A^S^E ARGUMENT LIST (SEE SECTION 2.3.3.3.).
.SKIP
.INDENT -18
^P^R^I^N^C^A^L
.BREAK
.INDENT -18
^^PRINPAR\\
.BREAK
*^SPECIALIZED ROUTINES HANDLING SEMANTICS FOR ^P^R^I^N^T AND ^R^E^A^D
^P^R^I^N^P^A^R           STATEMENTS.
.SKIP
.INDEX ^R^E^G^O^F
.INDENT -18
^R^E^G^O^F(^S)
.BREAK
 ^RESULT IS THE REGISTER OF THE OBJECT ^S, OR 0 IF IT  DOESN'T
HAVE ONE.
.SKIP
.INDENT -18
^R^E^G2^S(^S)
.BREAK
^IF ^S IS OF TYPE REGISTER, AND THE REGISTER WAS ASSIGNED
BY ^A^R^E^G1 SO AS TO RESERVE TWO CONSECUTIVE REGISTERS,
THEN THE VALUE OF ^S BECOMES THE CONTENTS OF THE SECOND
REGISTER.  ^S IS OTHERWISE UNCHANGED.  ^IF ^S IS NOT AS
SPECIFIED, UNDEFINED THINGS HAPPEN.  ^THE VALUE OF ^R^E^G2^S
IS ^S.
.SKIP
.INDENT -18
^R^E^M^O^T^E(^S)
.BREAK
 ^CAUSES THE CODE ASSOCIATED WITH ^S TO BE INSERTED AT THE END
OF THE COMPILATION INSTEAD OF AT THE CURRENT POINT.  ^RESULT
IS ^S, BUT WITH NO CODE.  (^THIS MAY LEAD TO INCORRECT RESULTS
                  IF AN ATTEMPT IS MADE TO COMPUTE WITH THE VALUE OF ^S.)
.SKIP
.INDENT -18
^R^E^P^V^A^L(^S,^T)
.BREAK
 ^PART OF THE SEMANTICS FOR SYNTAX.  ^GENERALIZES THE ^V^A^L^U^E
CLASS ^S WITHIN THE QUOTED SEMANTICS ^T (SEE ^SECTION 2.3.3.4).
.SKIP
.INDENT -18
^R^E^T^U^R^N(^S)
.BREAK
*^GENERATES CODE TO RETURN FROM THE CURRENT SUBROUTINE (^J^R^A)
WITH ^S AS THE VALUE OF THE SUBROUTINE.  ^RESULT IS ^S, NOT
THAT IT MATTERS.
.SKIP
.INDENT -18
^S^T^A^C^K^U^P(^I)
.BREAK
 ^I IS EITHER A NEGATIVE DIRECTORY INDEX OR A CONSTANT.
^THIS ROUTINE IS USED TO CREATE OBJECTS AND PLACE THEM ON
THE STACK. (^IF ^I IS A CONSTANT, THE CONSTANT IS FIRST ENTERED
IN THE DIRECTORY, SO THAT A DIRECTORY INDEX FOR THE ITEM
EXISTS.)  ^N^A^M^E(^E^N^S^T^A^C^K(^I)) IS THEN PERFORMED TO MAKE THE
OBJECT. ^RESULT IS STACK INDEX OF THE ITEM.
.SKIP
.INDENT -18
^S^E^T^P^R^I(^I)
.BREAK
 ^PART OF THE SEMANTICS FOR SYNTAX.  ^SETS THE DESIGNATED PRIORITY BITS IN THE SEMANTICS BEING GENERATED.
.SKIP
.INDENT -18
^S^T^A^C^K(^I)
.BREAK
 ^RETURNS THE ^ITH ARGUMENT OF THE PRODUCTION.  ^USED TO REFER TO
ARGUMENTS WHICH ARE ^V^A^L^U^E CLASSES IN DEFAULT SEMANTICS (I.E.,
SEMANTICS WHICH ARE NOT CONDITIONAL.)
.SKIP
.INDENT -18
^S^T^O^R^E(^S,^T)
.BREAK
*^STORES THE VALUE OF ^T IN ^S, HOOKING THE CODE FOR ^S ON AFTER
THAT FOR ^T.  ^RESULT IS ^T.
.SKIP
.INDENT -18
^S^U^B^B^E^G(^S)
.BREAK
*^GENERATES CODE FOR THE BEGINNING OF SUBROUTINE ^S, WHERE ^S IS
A ^NAME-TYPE OBJECT.  ^RESULT IS ^S, WITH THE CODE ATTACHED.
.SKIP
.INDENT -18
^S^U^B^P^R0(^I)
.BREAK
 ^CALLED WITH ^I=0 AT THE BEGINNING, AND ^I=1 AT THE END, OF EVERY
SUBROUTINE CALL.  ^KEEPS TRACK OF THE LEVEL OF CALLS, AND
RESETS THE INDEX OF THE NEXT TEMPORARY FOR SUBROUTINE ARGUMENTS TO 0 WHENEVER IT GETS UP TO LEVEL 0.
.SKIP
.INDENT -18
^S^U^B^R^C^A^L^L(^S)
.BREAK
*^S MUST BE OF TYPE ^VARIABLE.  ^GENERATES A SUBROUTINE CALL TO ^S
(^J^S^A 16,^S), PLUS CODE TO DECLARE ^S COMMON, AND TO SAVE ANY
REGISTERS IN USE AT THE TIME IN TEMPORARIES.  (^REGISTERS ARE
RESTORED BY A ^D^E^W^F^U^N(^T,2,^R^E^G^O^F(^T),^S^U^B^P^R0(1)), WHERE ^T IS THE
COMPLETE SUBROUTINE CALL WITH ARGUMENTS.  ^THE RESULT OF
^S^U^B^R^C^A^L^L IS ^S, WHOSE VALUE IS NOW REGISTER 0^R, WHICH IS WHERE
SUBROUTINES RETURN VALUES.
.SKIP
.INDENT -18
^S^U^B^R^P^A^R(^S,^T)
.BREAK
*^S IS A SUBROUTINE CALL OR SOME SIMILAR THING BEING BUILT, AND
                  ^T IS AN ARGUMENT.  ^A WORD OF CODE CONTAINING A ^J^U^M^P ^A, WHERE ^A
IS THE ADDRESS OF ^T, IS ADDED ON TO THE END OF ^S.  ^IF ^T HAS NO
ADDRESS, ^A IS THE ADDRESS OF A TEMPORARY CONTAINING THE VALUE
OF ^T.  ^THE CODE FOR ^T, AND ANY ADDITIONAL CODE NECESSARY TO
GET THE ^J^U^M^P ^A UP TO SPECS, IS HOOKED ON TO THE BEGINNING OF
^S.  ^THE RESULT IS ^S.
.SKIP
.INDENT -18
^S^U^B^S^C^R^I^P^T(^S,^T)
.BREAK
*^GENERATES CODE FOR THE ^VARIABLE- OR ^MEMORY-TYPE OBJECT ^S[^T].
^IS SMART ABOUT NOT COMPUTING CONSTANT SUBSCRIPTS, ETC.  ^S
AND ^T MAY BE ANY TYPE EXCEPT NAME.  ^RESULT IS ^S, WITH THE
CODE FOR ^T HOOKED ON BEFORE.
.SKIP
.INDENT -18
^S^V^A^L(^I)
.BREAK
 ^CREATES AN OBJECT WHOSE ^V^A^L IS ^I.  (^SEE ALSO ^V^A^L).
.SKIP
.INDENT -18
^S^W^I^T^C^H(^I)
.BREAK
^TURNS ON THE COMPILER SWITCH WHICH IS THE ^ITH LETTER OF
THE ALPHABET.
.SKIP
.INDENT -18
^T^A^G(^S)
.BREAK
 ^S HAD BETTER BE AN OBJECT OF TYPE ^NAME, OR ^VARIABLE WITHOUT
A SUBSCRIPT.  ^ADDS TO ^S THE CODE WHICH DEFINES THE TAG ^S AT
THAT POINT.  ^RESULT IS ^S.
.SKIP
.INDENT -18
^V^A^L(^S)
.BREAK
 ^RETURNS THE LOW ORDER 18 BITS OF THE VALUE OF THE OBJECT ^S.
^IF ^S IN A CONSTANT, THEN THIS IS THE LOW 18 BITS OF ITS VALUE.
^IF ^S IS THE RESULT OF A ^V^A^L^U^E SEMANTICS, THEN THIS IS THE
VALUE SPECIFIED THERE.  ^IF ^S HAS HAD A VALUE SET BY ^S^V^A^L, THEN
THIS IS THAT VALUE.
.SKIP
.INDENT -18
^V^A^L^U(^S,^T)
.BREAK
 ^PART OF THE SEMANTICS FOR SYNTAX.  ^DEFINES THE CURRENT SEMANTICS TO BE ^V^A^L^U^E ^S ^O^F ^T, WHERE ^S IS A ^CONSTANT OBJECT AND ^T
IS A ^NAME OBJECT.
.LEFT MARGIN 0
.PARAGRAPH
^IN ADDITION TO THE ABOVE, THERE ARE A NUMBER OF SEMANTIC ROUTINES WHICH
DEFINE THE SEMANTICS FOR SYNTAX, ALL ON FILE ^R^S^Y^N.  ^SEE ^SECTION 4.4 FOR
DOCUMENTATION.
.SUBTITLE 2.3.3.2: ^CONDITIONAL ^SEMANTICS.
.PAGE
.CENTER
^&2.3.3.2: ^CONDITIONAL ^SEMANTICS.\&
.SKIP
.INDEX CONDITIONAL SEMANTICS
.INDEX SEMANTICS, CONDITIONAL
.PARAGRAPH
^WE SAW ABOVE THAT SEMANTICS MAY CONSIST OF EITHER A SEMANTIC ROUTINE CALL
OR QUOTED SEMANTICS.  ^IT IS POSSIBLE TO INVOKE ONE OF A NUMBER OF SEMANTICS
FOR A GIVEN SYNTACTIC PRODUCTION, DEPENDING ON THE PARTICULAR CASE OF THAT
PRODUCTION BEING COMPILED.  ^FIRST AN EXAMPLE:
.SKIP
.CENTER
<^A^T^O^M>::= ^N^O^T <^A^T^O^M,^A>  ::= "^N^O^T ^B0^C^O^N"=>^C^O^N^O^P(^B,0,6) ^E^L^S^E
.CENTER
^D^E^W^O^P(460^B,^A^R^E^G1(1,15^B),^A);
.SKIP
^THE SEMANTIC PART OF THIS SYNTAX STATEMENT INVOKES DIFFERENT SEMANTICS FOR THE
SPECIAL CASE OF ^N^O^T-CONSTANT.
.PARAGRAPH
^SEMANTICS MAY CONSIST OF A NUMBER OF ALTERNATIVES, SEPARATED BY THE IDENTIFIER ^E^L^S^E.  ^ONE ALTERNATIVE MAY CONSIST SIMPLY OF A SEMANTIC ROUTINE CALL OR
QUOTED SEMANTICS: THIS IS THE SEMANTICS EXECUTED IF NONE OF THE SPECIAL CASES
OBTAIN.  ^THE OTHER ALTERNATIVES ARE OF THE FORM
.SKIP
.CENTER
CONDITION => SEMANTICS
.SKIP
WHERE THE SEMANTICS IS A SEMANTIC ROUTINE CALL OR QUOTED SEMANTICS, AND THE CONDITION IS AN ^I^M^P EXPRESSION WHICH IS A CASE OF THE PRODUCTION, ENCLOSED IN
DOUBLE QUOTES.  ^THE ARGUMENTS OF THE SEMANTICS SHOULD BE IDENTIFIERS
WHICH DESIGNATE ARGUMENTS IN THE CONDITION.  ^REFERRING TO IDENTIFIERS WHICH
DESIGNATE ARGUMENTS IN THE SYNTAX PART WILL NOT GIVE A DIAGNOSTIC BUT MIGHT
PRODUCE UNDESIRED RESULTS.
.PARAGRAPH
^THE CONDITION IS SATISFIED IF THE EXPRESSION BEING PARSED MATCHES THE
EXPRESSION IN THE CONDITION.  ^CONSTANTS IN THE CONDITION WILL MATCH ANY
CONSTANT WITH THE SAME VALUE, EVEN IF THE NAMES ARE DIFFERENT.  (^BUT CONSTANT
EXPRESSIONS IN THE CONDITION ARE NOT EVALUATED.  ^THUS, "-18" IN A CONDITION
WOULD ONLY MATCH IN CASES WHERE A MINUS SIGN WAS ACTUALLY USED BEFORE A CONSTANT WITH VALUE 18.  ^ONE SHOULD TRUST THE COMPILER TO PERFORM CONSTANT
ARITHMETIC, AND WRITE 777777777756^B  INSTEAD, WHICH WILL MATCH ANY CONSTANT
EXPRESSION WHICH EVALUATES TO -18.)  ^VARIABLE NAMES
WILL MATCH ANY <^E^X^P>, UNLESS THEY ARE TAGGED WITH MODIFIERS.  ^IF THE
SAME NAME APPEARS TWICE OR MORE IN THE CONDITION, THE EXPRESSIONS MATCHING
ALL OCCURRENCES MUST BE IDENTICAL.
.INDEX MODIFIERS (IN SEMANTIC CONDITIONS)
.PARAGRAPH
^MODIFIERS MAY BE ADDED TO THE FIRST OCCURRENCE OF A GIVEN VARIABLE NAME IN
A CONDITION BY ADDING THE CHARACTER '0' TO THE NAME, FOLLOWED BY THE MODIFIERS.
^MODIFIERS ALL CONSIST OF THREE LETTERS,SOMETIMES FOLLOWED BY ONE OR TWO TWODIGIT OCTAL NUMBERS.  ^FOR EXAMPLE, ^A0^C^O^N, ^F^O^O0^R^E^G0115, ^I0^I^G^R^V^A^R^M^E^M^R^E^G.  ^THE
MODIFIERS ARE:
.SKIP
.LEFT MARGIN 10
.INDENT -10
^ARITHMETIC TYPE MODIFIERS (^IDENTIFIERS WITH NEITHER OF THESE MATCH EITHER
TYPE):
.SKIP
.INDENT -5
^I^G^R:      ^IDENTIFIER MATCHES ONLY OBJECTS OF TYPE INTEGER.
.INDENT -5
^F^L^T:      ^IDENTIFIER MATCHES ONLY OBJECTS OF TYPE REAL.
.SKIP
.INDENT -10
^OBJECT TYPE MODIFIERS (^IDENTIFIERS WITH NONE OF THESE MATCH ANY OBJECT TYPE;
IDENTIFIERS WITH SEVERAL MATCH ANY OF THE INDICATED TYPES):
.SKIP
.INDENT -5
^R^E^G:      ^MATCHES OBJECTS OF TYPE ^REGISTER.
.INDENT -5
^R^E^GII:    ^MATCHES OBJECTS GUARANTEED TO BE IN REGISTER II.
.INDENT -5
^R^E^GIIJJ:  ^MATCHES OBJECTS GUARANTEED TO BE IN A REGISTER BETWEEN II AND
JJ.  ^RANGE FOR II AND JJ IS 0-37 (OCTAL).
.INDENT -5
^C^O^N:      ^MATCHES OBJECTS OF TYPE CONSTANT.
.INDENT -5
^C^O^NII:    ^MATCHES OBJECTS WHICH ARE CONSTANT, AND ZERO EXCEPT FOR THE II
RIGHTMOST BITS.
.INDENT -5
^C^O^NIIJJ:  ^MATCHES OBJECTS WHICH ARE CONSTANT, AND ZERO EXCEPT FOR THE II
BITS STARTING JJ FROM THE RIGHT END OF THE WORD.  ^RANGE FOR
II AND JJ IS 0-77 (OCTAL).
.INDENT -5
^C^N^G:      ^SAME AS ^C^O^N (AND MAY HAVE II OR IIJJ OR ATTACHED), BUT MATCHES
OBJECTS WHICH ARE CONSTANT IN THE DESIGNATED FIELD, WITH ALL
BITS OUTSIDE THAT FIELD SET TO 1.  ^C^O^N AND ^C^N^G SHOULD NOT
BOTH BE USED TO MODIFY THE SAME IDENTIFIER.
.INDENT -5
^V^A^R:      ^MATCHES OBJECTS OF TYPE ^VARIABLE.
.INDENT -5
^M^E^M:      ^MATCHES OBJECTS OF TYPE ^MEMORY.
.SKIP
.INDENT -10
^CODE MODIFIER:
.SKIP
.INDENT -5
^W^R^D:      ^MATCHES OBJECTS WITH EXACTLY ONE WORD OF CODE ASSOCIATED WITH
THEM.  ^MAY NOT ALWAYS SUCCEED WHEN ONE MIGHT THINK IT SHOULD,
DUE TO THE ORDER IN WHICH OBJECTS ARE COMBINED BY THE CODE
GENERATOR, BUT WILL ALWAYS FAIL WHEN IT SHOULD.
.LEFT MARGIN 0
.PARAGRAPH
^NUMEROUS EXAMPLES OF CONDITIONAL SEMANTICS MAY BE FOUND ON FILE ^S^Y^N^T^A^X,
WHICH CONTAINS THE SYNTAX FOR ^I^M^P72.
.PARAGRAPH
^CARE SHOULD BE TAKEN TO SPECIFY SPECIAL CASES AS CASES OF THE PROPER
PRODUCTION.  ^FOR EXAMPLE, SUPPOSE ONE WISHED TO REFER TO THE RIGHT 18 BITS
OF A VARIABLE BY THE CONSTRUCT /VARIABLE/.  ^THIS MIGHT BE ACCOMPLISHED BY
.SKIP
.CENTER
<^V^B^L> ::= / <^V^B^L,^A> / ::= ^D^E^W^O^P(550^B,^A^R^E^G1(1,13),^A)
.SKIP
WHICH FETCHES THE RIGHT HALF OF ^A INTO A REGISTER BY A ^HALF ^RIGHT TO ^RIGHT,
^ZEROS INSTRUCTION.  ^IF ONE WANTED ALSO TO BE ABLE TO WRITE
.SKIP
.CENTER
/VARIABLE/ __ EXPRESSION
.SKIP
AND STORE THE VALUE OF THE EXPRESSION IN THE RIGHT HALF OF VARIABLE, ONE MIGHT
THEN WRITE
.SKIP
.CENTER
<^V^B^L> ::= / <^V^B^L,^A> / ::= ^D^E^W^O^P(550^B,^A^R^E^G1(1,13),^A)
.CENTER
   ^E^L^S^E "/^A/__^B" => ^H^O^O^K(^A,^B,^D^E^W^O^P(542^B,^R^E^G^O^F(^F^E^T^C^H(^B)),^A)
.SKIP
(542^B IS A ^HALF ^RIGHT TO ^RIGHT ^MEMORY INSTRUCTION.)  ^BUT
/^A/__^B IS A SPECIAL CASE NOT OF THIS PRODUCTION BUT OF THE PRODUCTON FOR
"__".  ^THE ABOVE SYNTAX STATEMENT WOULD PRODUCE AN ERROR DIAGNOSTIC.  ^THE
CORRECT DEFINITION WOULD BE
.SKIP
.NOFILL
<^V^B^L> ::= / <^V^B^L,^A> / ::= ^D^E^W^O^P(550^B,^A^R^E^G1(1,13),^A);
<^E^X^P>  ::= <^V^B^L,^A> __ <^E^X^P,^B> ::=
    "/^A/__^B" => ^H^O^O^K(^A,^B,^D^E^W^O^P(542^B,^R^E^G^O^F(^F^E^T^C^H(^B)),^A)
.FILL
.INDEX DUPLICATE PRODUCTIONS
.SKIP
^THIS WOULD PRODUCE AN ADVISORY DIAGNOSTIC, SINCE THE SYNTAX IN THE SECOND STATEMENT DUPLICATES A PRODUCTION ALREADY IN THE LANGUAGE, BUT THIS IS PERMITTED IN
ORDER TO ALLOW DEFINING ADDITIONAL SPECIAL CASES OF SEMANTICS, EXACTLY AS IS
DONE HERE.
.SUBTITLE 2.3.3.3: ^C^A^S^ES.
.PAGE
.INDEX ^C^A^S^E
.CENTER
^&2.3.3.3: ^C^A^S^ES.\&
.SKIP
.PARAGRAPH
^IF TWO OR MORE PRODUCTIONS HAVE EXACTLY THE SAME SYNTAX, EXCEPT FOR
TERMINAL SYMBOLS (I.E., THEY CONTAIN THE SAME SYNTACTIC CLASSES IN THE SAME
ORDER, AND ARE INSTANCES OF THE SAME CLASS), AND IF THEIR SEMANTICS ARE
DEFINED BY IDENTICAL SEMANTIC ROUTINE CALLS, WITH PERHAPS ONLY A FEW CONSTANTS
CHANGED (E.G., DIFFERENT OPCODES), THEN IT IS POSSIBLE TO DEFINE A GENERAL CASE,
AND DEFINE THE SEMANTICS OF EACH PRODUCTION AS A SPECIAL CASE OF IT.
.PARAGRAPH
^EXAMPLE:
.SKIP
.NOFILL
.TEST PAGE 10
<^E^X^P> ::= <^A^T^O^M,^I> ^L^S <^E^X^P,^J> ::= ^C^A^S^E (242^B,514^B,554^B) ^O^F
      ^S^H^I^F^T^S  (^A^D^D^O^P(^P^A^R(0),^A^D^D^R(^J),^I)
      ^E^L^S^E "^A0^V^A^R^M^E^M ^L^S 18"=>^D^E^W^O^P(^P^A^R(1),^A^R^E^G1(1,15^B),^A)
      ^E^L^S^E "^A0^V^A^R^M^E^M ^L^S 777777777756^B"=>
               ^D^E^W^O^P(^P^A^R(2),^A^R^E^G1(1,15^B),^A))
      ^E^L^S^E "^A0^C^O^N ^L^S ^B0^C^O^N"=>^C^O^N^O^P(^A,^B,5);
<^E^X^P> ::= <^A^T^O^M,^A>  ^A^L^S <^E^X^P,^B> ::=
       ^C^A^S^E (240^B,514^B,574^B) ^O^F ^S^H^I^F^T^S;
<^E^X^P> ::= <^A^T^O^M,^A> ^L^R^O^T <^E^X^P,^B> ::=
       ^C^A^S^E (241^B,204^B,204^B) ^O^F ^S^H^I^F^T^S;
.FILL
.PARAGRAPH
^THE FIRST STATEMENT DEFINES THE SYNTAX FOR ^I ^L^S ^J.  ^THE SEMANTIC PART DEFINES
THE CASE ^S^H^I^F^T^S TO CONSIST OF THE SET OF SEMANTIC ALTERNATIVES WITHIN THE PARENTHESES FOLLOWING THE IDENTIFIER ^S^H^I^F^T^S.  (^NOTICE THAT THE ^A0^C^O^N ^L^S ^B0^C^O^N ALTERNATIVE IS NOT PART OF THE ^S^H^I^F^T^S DEFINITION BUT IS AN ALTERNATIVE TO IT.)
^THE LIST OF CONSTANTS FOLLOWING THE IDENTIFIER ^C^A^S^E IS THE "PARAMETER LIST" FOR
THIS PARTICULAR INSTANCE (^L^S) OF THE CASE ^S^H^I^F^T^S.  ^THESE CONSTANTS ARE REFERRED
TO IN THE SEMANTICS FOR ^S^H^I^F^T^S BY ^P^A^R(0), ^P^A^R(1), AND ^P^A^R(2).
.PARAGRAPH
^THE OTHER TWO STATEMENTS DEFINE THE SYNTAX AND SEMANTICS FOR TWO OTHER KINDS
OF SHIFTS.  ^THE SEMANTICS IS DEFINED
BY INVOKING ^S^H^I^F^T^S WITH DIFFERENT PARAMETER LISTS.  ^THE
SEMANTICS ARE THE SAME, BUT ^P^A^R(I) WILL REFER TO THE I-TH ELEMENT OF THE APPROPRIATE PARAMETER LIST.
.PARAGRAPH
^A CASE, SUCH AS ^S^H^I^F^T^S, MAY NOT BE DEFINED IN MORE THAN ONE PLACE.  ^IT IS
NOT NECESSARY TO HAVE PARAMETER LISTS BE THE SAME LENGTH FOR DIFFERENT INSTANCES
OF A CASE, BUT IT IS THE USER'S RESPONSIBILITY TO INSURE THAT PARAMETERS THAT
ARE NOT SUPPLIED ARE NOT REFERRED TO.  ^IN ANY EVENT, PARAMETER LISTS MUST ALWAYS
CONTAIN AT LEAST ONE CONSTANT.
.PARAGRAPH
^SEVERAL ^C^A^S^E SEMANTICS MAY APPEAR AS SOME OR ALL OF THE ALTERNATIVES IN A
SEMANTIC PART.  ^A ^C^A^S^E SEMANTICS MAY NOT BE THE SEMANTICS PART OF A CONDITIONAL
SEMANTICS ALTERNATIVE (I.E., "CONDITION"=>^C^A^S^E (...) ^O^F ^F^O^O IS ILLEGAL.)
.SUBTITLE 2.3.3.4: ^THE ^V^A^L^U^E ^KLUDGE.
.PAGE
.INDEX ^V^A^L^U^E
.INDEX KLUDGE
.CENTER
^&2.3.3.4: ^THE ^V^A^L^U^E ^KLUDGE.\&
.SKIP
.PARAGRAPH
^OCCASIONALLY, IT IS NECESSARY TO REFER IN CONDITIONAL SEMANTICS TO AN ARGUMENT OF THE PRODUCTION WHICH CAN NOT BE WRITTEN AS AN IDENTIFIER.  ^THIS IS NOT
POSSIBLE USING THE MECHANISMS DEFINED SO FAR.  ^THE ^V^A^L^U^E KLUDGE IS A WAY TO
ACCOMPLISH THIS.  ^TAKE FOR EXAMPLE THE SYNTAX FOR CONDITIONALS.  ^RELATIONAL
OPERATORS ARE DEFINED AS FOLLOWS:
.SKIPER
<^R^E^L^O^P> ::= ^N^E  ::= ^V^A^L^U^E 6 ^O^F ^E^Q;
.CENTER
<^R^E^L^O^P> ::= '<' ::= ^V^A^L^U^E 1 ^O^F ^E^Q;
.SKIP
AND SO ON.  ^THE
SEMANTICS SPECIFIES THAT THESE PRODUCTIONS ARE SPECIAL CASES OF A
CLASS OF PRODUCTIONS LABELED ^E^Q, AND GIVES AN 18-BIT VALUE TO BE ASSOCIATED
WITH THE PARTICULAR PRODUCTION.
.PARAGRAPH
^IN SYNTAX STATEMENTS INVOLVING THE CLASS <^R^E^L^O^P>, IT IS POSSIBLE TO SPECIFY
THAT ANY CASE OF ^E^Q MAY BE RECOGNIZED AS MATCHING A PARTICULAR ELEMENT IN A
SEMANTIC CONDITION.  ^THIS IS DONE AS FOLLOWS:
.SKIP
.LEFT MARGIN 10
.INDENT -3
1. ^IN QUOTED UNCONDITIONAL SEMANTICS:  PREFIX THE QUOTED PART BY  ^E^Q/.
^THE CORRESPONDING INSTANCE OF ^R^E^L^O^P IN THE SYNTAX PART MUST BE
NAMED ^E^Q.  (^LAST LINE IN THE EXAMPLE BELOW).
.SKIP
.INDENT -3
2. ^IN SEMANTIC CONDITIONS:  ^PREFIX THE CONDITION BY ^E^Q/.
.SKIP
.INDENT -3
3. ^IN SEMANTICS: ^THE ELEMENT
 MAY BE REFERRED TO IN QUOTED SEMANTICS BY PREFIXING THE QUOTED PART
BY ^E^Q/ AS IN (1).  ^IN SEMANTIC ROUTINE CALLS, THE ELEMENT MAY BE REFERENCED BY ^S^T^A^C^K(I), WHERE THE ELEMENT COMES TO THE RIGHT OF EXACTLY I
IDENTIFIERS IN THE CONDITION (OR, IN UNCONDITIONAL SEMANTICS, I ARGUMENTS OF THE
PRODUCTION).
.LEFT MARGIN 0
.PARAGRAPH
^THE PARTICULAR INSTANCE OF ^E^Q MAY BE DETERMINED BY REFERRING TO
^V^A^L(^S^T^A^C^K(I)), WITH I AS IN (2) ABOVE.  ^THE VALUE OF THIS SEMANTIC ROUTINE CALL
WILL BE THE VALUE SPECIFIED IN THE ^V^A^L^U^E SEMANTICS DEFINING THE INSTANCE OF
<^R^E^L^O^P> IN THE EXPRESSION BEING COMPILED.
.PARAGRAPH
^EXAMPLE:
.SKIP
.NOFILL
.LEFT MARGIN 5
<^S^T>    ::= <^E^X^P,^A> <^R^E^L^O^P,^E^Q> <^E^X^P,^B> => <^S^T,^C> ::=
  ^E^Q/"^P0^R^E^G=0=>^G^O ^T^O ^S0^V^A^R"=>^H^O^O^K(^P,^P,^D^E^W^O^P(320^B+^V^A^L(^S^T^A^C^K(1)),
                                 ^R^E^G^O^F(^P),^S)) ^E^L^S^E
  ^L^O^C^A^L ^I^F ^I^N ^E^Q/"^N^O^T(^A=^B)=>^G^O ^T^O ^I^F; ^C; ^I^F: 0";
.FILL
.SUBTITLE 2.3.3.5: ^PRIORITY ^SEMANTICS.
.PAGE
.INDEX PRIORITY SEMANTICS
.CENTER
^&2.3.3.5: ^PRIORITY ^SEMANTICS.\&
.SKIP
.PARAGRAPH
^USUALLY, THE SEMANTICS FOR AN EXPRESSION IS NOT EXECUTED UNTIL ENOUGH OF THE
CONTEXT OF THE EXPRESSION HAS BEEN PARSED IN ORDER TO DETERMINE THE PARTICULAR
SPECIAL CASE INVOLVED.  ^IF IT IS KNOWN THAT NO SPECIAL CASES INVOLVING SUBEXPRESSIONS OF A PRODUCTION EXIST, OR IF IT IS DESIRED FOR OTHER REASONS TO
DEFEAT THE SPECIAL CASE MATCHING MECHANISM AND INVOKE THE SEMANTICS FOR A
PRODUCTION IMMEDIATELY IT IS RECOGNIZED, THE ^P^R^I^O^R^I^T^Y SEMANTICS IS USED.
.PARAGRAPH
^A ^P^R^I^O^R^I^T^Y SEMANTICS IS A SEMANTIC PART CONSISTING ENTIRELY OF
.SKIP
.CENTER
^P^R^I^O^R^I^T^Y N S
.SKIP
WHERE N IS A DIGIT IN THE RANGE 0-7, AND S IS A SEMANTIC PART CONTAINING NO
CONDITIONAL SEMANTICS OR ^E^L^S^E ALTERNATIVES.
.PARAGRAPH
N IS INTERPRETED AS A THREE-BIT MASK, AND THE SEMANTICS S FOR THE PRODUCTION
IS EXECUTED IMMEDIATELY, BYPASSING THE SPECIAL CASE MATCHING PROCESS, IN THE
EVENT THAT THE CURRENT PRIORITY MASK OF THE MATCHING ROUTINE AND N HAVE ANY
BITS SET IN THE SAME POSITION.
.PARAGRAPH
^THE PRIORITY MASK OF THE MATCHING ROUTINE IS SET TO K BY THE SEMANTIC
ROUTINE ^S^E^T^P^R^I(K).  ^THE INTERPRETATIONS OF THE BITS ARE:
.LEFT MARGIN 10
.SKIP
.INDENT -3
1.  ^NORMALLY SET.  ^USED TO FORCE IMMEDIATE SEMANTIC EXECUTION UNDER NORMAL
CIRCUMSTANCES.
.SKIP
.INDENT -3
2.  ^SET DURING INTERPRETATION OF DOUBLE-QUOTED EXPRESSIONS.  ^IN THIS MODE,
SEMANTICS ARE NOT INTERPRETED UNLESS THEY ARE ^P^R^I^O^R^I^T^Y 2.  ^THE OUTPUT
OF THE PARSER IS STORED INSTEAD, FOR USE AS DATA BY THE COMPILER.
^HOWEVER, ^P^R^I^O^R^I^T^Y 2 SEMANTICS ARE EXECUTED, PROVIDING A WAY TO TERMINATE THIS STATE.
.SKIP
.INDENT -3
4.  ^SET DURING SYNONYM PROCESSING (^^LET\\ STATEMENT).
.LEFT MARGIN 0
.SUBTITLE 2.3.4: ^SYNTACTIC ^AMBIGUITY AND ^HOW TO ^MAKE IT ^WORK FOR ^YOU.
.PAGE
.INDEX SYNTACTIC AMBIGUITY
.INDEX AMBIGUITY, SYNTACTIC
.CENTER
2.3.4: ^SYNTACTIC ^AMBIGUITY AND ^HOW TO ^MAKE IT ^WORK FOR ^YOU.
.SKIP
.PARAGRAPH
^THE ^I^M^P72 PARSER ALLOWS AMBIGUITY IN THE SYNTAX.  ^FOR EXAMPLE, NOTICE THAT
IN MANY EXAMPLES ABOVE, WE PRESENT DIFFERENT DEFINITIONS OF THE CONSTRUCT
^A^B^S(^E).  ^THE SYNTAX ALLOWS TWO INTERPRETATIONS OF THIS CONSTRUCT: THE SPECIAL
CONSTRUCT WE ARE DEFINING, OR A CALL ON THE SUBROUTINE ^A^B^S.  ^THE PARSER NOTES
THE TWO INTERPRETATIONS, AND CHOOSES BETWEEN THEM, AS FOLLOWS:
.LEFT MARGIN 10
.SKIP
.INDENT -3
1. ^IF AN IDENTIFIER IS AN EXPRESSION IN ONE INTERPRETATION, AND A TERMINAL
SYMBOL (I.E., APPEARS AS ITSELF IN THE PRODUCTION, SUCH AS ^A^B^S IN THE
EXAMPLE OF ^SECTION 2.3.1), IN THE OTHER INTERPRETATION,
THE INTERPRETATION WITH THE TERMINAL SYMBOL IS CHOSEN.
.SKIP
.INDENT -3
2. ^OTHERWISE, THE INTERPRETATION INVOLVING THE SMALLEST NUMBER OF DIFFERENT
SYNTAX RULES IS CHOSEN.
.SKIP
.INDENT -3
3. ^OTHERWISE, THE COMPILER MAKES AN ARBITRARY CHOICE.
.LEFT MARGIN 0
.PARAGRAPH
^THUS, REFERRING TO THE EXAMPLE IN ^SECTION 2.3.3.2 OF THE CONSTRUCT
/VARIABLE/, THE SPECIAL CASE /VARIABLE/__EXPRESSION WAS DEFINED BY A SPECIAL CASE
IN THE SEMANTICS.  ^IT WOULD ALTERNATIVELY BE POSSIBLE TO DEFINE THE CASE BY
INTRODUCING A DELIBERATE SYNTACTIC AMBIGUITY, AS FOLLOWS:
.SKIP
.NOFILL
.LEFT MARGIN 10
<^V^B^L> ::= / <^V^B^L,^A> /
                    ::= ^D^E^W^O^P(550^B,^A^R^E^G1(1,13),^A);
<^E^X^P>  ::= / <^V^B^L,^A> / __ <^E^X^P,^B>
                    ::= ^H^O^O^K(^A,^B,^D^E^W^O^P(542^B,^R^E^G^O^F(^F^E^T^C^H(^B)),^A)
.FILL
.LEFT MARGIN 0
.PARAGRAPH
^THE EXPRESSION /^X/__5, E.G., COULD BE RECOGNIZED IN TWO WAYS, BY USING THE FIRST
SYNTAX STATEMENT ABOVE PLUS THE RULE FOR <^V^A^R>__<^E^X^P>, OR BY USING THE SECOND
SYNTAX STATEMENT ABOVE.  ^BUT ACCORDING TO RULE 2, THE PARSER CHOOSES THE SECOND
INTERPRETATION, AS INVOLVING ONE SYNTAX RULE AS OPPOSED TO TWO RULES FOR THE
FIRST INTERPRETATION.  ^THIS IS PRECISELY THE CHOICE THAT IS DESIRED.
.SUBTITLE 2.3.5: ^PEACEFUL ^CO-^EXISTENCE WITH ^YOUR ^EXTENSIBLE ^COMPILER.
.PAGE
.CENTER
^&2.3.5: ^PEACEFUL ^CO-^EXISTENCE WITH ^YOUR ^EXTENSIBLE ^COMPILER.\&
.SKIP
.PARAGRAPH
^THIS SECTION PRESENTS THE RESULTS OF SOME EXPERIENCE WITH SYNTAX AND SEMANTIC DEFINITION IN ^I^M^P72, IN ORDER TO HELP OTHERS AVOID SOME PROBLEMS.
.PARAGRAPH
^THE PARSER WORKS BY CARRYING ALONG ALL POSSIBLE PARSES OF THE PROGRAM UP
TO THE SYMBOL IT IS READING AT THE MOMENT.  ^IT USUALLY MANAGES TO RESOLVE ALL
AMBIGUITY EVERY COUPLE OF SYMBOLS AT MOST.  ^IF A SYNTACTIC PRODUCTION IS ENTERED
WHICH REQUIRES IT TO READ A LARGE NUMBER OF SYMBOLS BEFORE IT CAN CHOOSE WHICH
SYNTAX RULE IT IS FOLLOWING, THE PARSER MAY REQUIRE INORDINATE AMOUNTS OF SPACE
AND TIME.  ^THIS CONDITION MAY BE DIAGNOSED BY LOOKING AT THE COMPILER STATISTICS
AT THE BOTTOM OF THE SOURCE PROGRAM LISTING.  ^IF THE ^MAX. ^PARSE ^SPACE GOES
OVER 1500+500, OR THE ^MAX. ^OUTPUT ^SPACE IS OVER 150, THE CONDITION MAY
EXIST.
.PARAGRAPH
^AN EXAMPLE OF SYNTAX WHICH MAY CAUSE THE PROBLEM IS:
.SKIP
.NOFILL
.LEFT MARGIN 10
<^E^X^P> ::= <^E^X^P,^A> => <^S^T,^B>;
<^E^X^P> ::= <^E^X^P,^A> => <^E^X^P,^B> ^E^L^S^E <^S^T,^C>
.LEFT MARGIN 0
.FILL
.SKIP
^WHEN THE COMPILER SEES ^A=>(.......), IT IS NOT ABLE TO DECIDE UNTIL THE RIGHT
PARENTHESIS WHETHER IT IS TRYING TO FORM AN ^S^T OR AN ^E^X^P.  ^THUS IT MUST CARRY
ALONG TWO PARSES WHILE IT IS PARSING THE ENTIRE CONTENTS OF THE PARENTHESES,
WHICH MAY BE AN ARBITRARILY LONG EXPRESSION.  ^THE SYNTAX ^I^M^P USES IS
.SKIP
.NOFILL
          <^E^X^P> ::= <^E^X^P,^A> => <^S^T,^B>;
          <^E^X^P> ::= <^E^X^P,^A> => <^S^T,^B> ^E^L^S^E <^S^T,^C>
.FILL
.SKIP
WHICH AVOIDS THE PARSER PROBLEM (ALTHOUGH IT INTRODUCES THE NECESSITY FOR PARENTHESIZING THE ^E^L^S^E CLAUSE).  ^THE METHOD FOR STORING SYNTAX RULES COMBINES ALL
RULES WHOSE RIGHT-HAND PARTS BEGIN IDENTICALLY, UP TO THE POINT AT WHICH THEY
DIFFER.  ^THUS, THE PARSER STORES THESE TWO RULES AS:
.SKIP
.NOFILL
                        =:: <^E^X^P>
                       /
      <^E^X^P,^A> => <^S^T,^B>
                       ^\
                        ^E^L^S^E <^S^T,^C> =:: <^E^X^P>
.SKIP
.FILL
AND ONLY CARRIES ALONG ONE PARSE UNTIL IT HAS FINISHED PARSING THE <^S^T,^B>.
.INDEX SPECIAL CASES, ORDER OF RECOGNIZING
.PARAGRAPH
^ANOTHER DIFFICULTY WHICH MAY ARISE IS THAT SPECIAL SEMANTIC CASES MAY BE
SPECIFIED IN A SYNTAX STATEMENT, BUT THE COMPILER WILL REFUSE TO RECOGNIZE THEM.
^THIS MAY ARISE FROM THE WAY IN WHICH THE PATTERNS FOR SPECIAL CASES ARE RECOGNIZED.  ^SEMANTICS ARE PERFORMED FOR SUBEXPRESSIONS OF A SYNTAX PRODUCTION FROM
LEFT TO RIGHT.  ^FOR AN ELEMENT IN A SYNTACTIC CONDITIONAL TO BE RECOGNIZED, IT
MUST ALREADY HAVE BEEN REDUCED BY SEMANTICS TO ONE OBJECT.  ^AN EXAMPLE WILL
ILLUSTRATE THE PITFALL:
.SKIP
.NOFILL
       <^E^X^P> ::= <^A^T^O^M,^A> ^N^E <^E^X^P,^B> ::= .....;
       <^S^T>  ::= <^E^X^P,^A> => <^S^T,^B> ::=
              "^A ^N^E 0=>^B" => ..... ^E^L^S^E .....
.FILL
.SKIP
WHERE THE ..... REPRESENTS SEMANTICS WHOSE EXACT FORM IS NONESSENTIAL TO THE
POINT BEING ILLUSTRATED.  ^IF THE STATEMENT
.SKIP
.CENTER
^A ^N^E 0=>^X__^X+4
.SKIP
IS ENCOUNTERED BY THE COMPILER, AN ATTEMPT TO MATCH THE SPECIAL CASE "^A ^N^E 0=>^B"
IS MADE, BUT FAILS SINCE ^X__^X+4 IS NOT A SINGLE OBJECT; THE SEMANTICS FOR __ AND +
HAVE NOT YET BEEN PERFORMED.  ^SINCE THE SPECIAL CASE FAILS, THE SEMANTICS FOR
THE SUBEXPRESSIONS OF THE STATEMENT ARE INVOKED, FROM LEFT TO RIGHT.  ^FIRST, THE
SEMANTICS FOR ^A ^N^E ^B IS PERFORMED.  ^CHECKS ARE MADE AT EVERY STEP TO SEE IF THE
CURRENT EXPRESSION MATCHES SOME SPECIAL CASE, BUT NOW ^A ^N^E 0 IS A SINGLE OBJECT,
AND WILL ONLY MATCH PATTERNS OF THE FORM "^X=>...".  ^THUS THE COMPILER WILL FAIL
TO RECOGNIZE THE SPECIAL CASE "^A ^N^E 0=>^B".
.PARAGRAPH
^IT IS IN ORDER TO AVOID THIS PROBLEM THAT ^I^M^P HAS SEPARATE PRODUCTIONS FOR
^A=>^B AND ^A <^R^E^L^O^P> ^B=>^C (WHERE <^R^E^L^O^P> IS THE CLASS OF RELATIONAL OPERATORS).
.SUBTITLE 3: ^HOW TO ^COMPILE AND ^RUN ^I^M^P72 ^PROGRAMS.
.PAGE
.INDEX COMPILING ^I^M^P72 PROGRAMS
.CENTER
^&3: ^HOW TO ^COMPILE AND ^RUN ^I^M^P72 ^PROGRAMS.\&
.SKIP 2
.SUBTITLE 3.1: ^COMPILING ^PROGRAMS.
.CENTER
^&3.1: ^COMPILING ^PROGRAMS.\&
.SKIP
.INDEX COMPILING ^I^M^P72 PROGRAMS
.INDEX SWITCHES, COMPILER
.PARAGRAPH
^THE ^I^M^P COMPILER IS CALLED BY THE ^D^E^CSYSTEM-10 COMMAND
^^R IMP\\ (ON ^^TENEX, \\ THE COMMAND ^I^M^P).  ^THE COMPILER WILL
RESPOND BY TYPING ITS VERSION NUMBER AND AN ASTERISK.  ^IT WILL
NOW ACCEPT A COMMAND LINE IN THE FOLLOWING FORMAT:
.SKIP
.CENTER
OBJ,LIST__DEV:FILE.EXT[PJ,PG]/A/B(CD)
.SKIP
^ALL FIELDS ARE OPTIONAL.  ^WHEN ALL ARE SPECIFIED, THE COMPILER WILL
COMPILE A PROGRAM FROM SOURCE FILE FILE.EXT[PJ,PG] ON DEVICE DEV.
^A LISTING WILL BE WRITTEN ON FILE LIST.^L^S^T, AND A RELOCATABLE OBJECT
PROGRAM WILL BE WRITTEN ON FILE OBJ.^R^E^L.  ^LISTINGS
REQUESTED BY COMPILER SWITCHES WILL BE WRITTEN ON FILE FILE.^L^S^T
IF NO LIST FILE IS SPECIFIED.  ^IF THE COMPILER DETECTS AN
ERROR, A LISTING WILL BE PRODUCED FROM THAT POINT IN THE SOURCE
FILE ON.  
^IF THE EXTENSION "EXT" IS OMITTED, THE COMPILER WILL LOOK FOR
A FILE WITH NULL EXTENSION, AND THEN FOR FILE.^I^M^P.
.PARAGRAPH
^A, B, C, D ARE COMPILER SWITCHES, AS FOLLOWS:
.SKIP
.LEFT MARGIN 5
.NOFILL
/^A  ^PRODUCE AN ^ASSEMBLY LISTING.
/^C  ^CONTINUE AFTER THIS FILE (SEE BELOW).
/^H  ^HELP - LIST THE SWITCHES AVAILABLE.
/^L  ^PRODUCE A SOURCE LISTING.
/^R  ^COMPILE ^RE-ENTRANT (PURE) CODE.
/^U  ^EXIT TO SAVE COMPILER.
/^V  ^EXIT TO SAVE LOW SEGMENT OF COMPILER (SEE BELOW).
/^Y  ^LIST SOURCE PROGRAM ON ^T^T^Y AS IT IS COMPILED.
.LEFT MARGIN 0
.FILL
.PARAGRAPH
^IF YOU WANT TO COMPILE THE ^I^M^P PROGRAM ON FILE ^F^I^L^E,
THE SIMPLEST WAY IS TO GIVE THE COMPILER THE COMMAND STRING ^F^I^L^E.
^IF A LISTING IS REQUIRED, THE STRING ^^FILE/A/L\\ WILL DO.
.PARAGRAPH
^THE /^C SWITCH ENABLES A FILE CONTAINING ONLY SYNTAX AND DECLARATION
STATEMENTS TO BE COMPILED FOR THE PURPOSE OF MAKING
A VERSION OF THE COMPILER FOR AN AUGMENTED DIALECT OF ^I^M^P.
^AFTER THE FILE HAS BEEN COMPILED, THE COMPILER RETURNS WITH ANOTHER
PROMPT, AND THE /^V OR /^U SWITCHES MAY BE USED.
.PARAGRAPH
^THE /^U SWITCH CAUSES THE COMPILER TO EXIT, AFTER DOING SOME
HOUSEKEEPING.  ^AT THIS POINT, THE MONITOR COMMAND ^^SSAVE NEWIMP\\
WILL MAKE FILES ^^NEWIMP.LOW\\ AND ^^NEWIMP.SHR\\ (OR A FILE
^^NEWIMP.SAV\\ ON ^^TENEX\\) WHICH WILL BE A NEW VERSION OF THE
COMPILER, CONTAINING ANY SYNTAX AND DECLARATIONS JUST COMPILED.
.PARAGRAPH
^THE /^V SWITCH IS SIMILAR TO THE /^U SWITCH.  ^IT IS USED TO MAKE
AN AUGMENTED VERSION OF THE COMPILER WHILE RETAINING THE PREVIOUS
SHARED HIGH SEGMENT.  ^THE SAVED VERSION OF THE COMPILER
WILL NOT CONTAIN A SHARABLE HIGH SEGMENT, BUT WILL, WHENEVER IT
IS RUN, FETCH THE HIGH SEGMENT FROM THE PREVIOUS VERSION OF THE
COMPILER.  ^ON ^^TENEX\\, OR IF THE HIGH SEGMENT
HAS BEEN ALTERED, THIS CAN NOT BE DONE.  ^IN THIS CASE, THE ERROR
MESSAGE ^^HIGH SEGMENT NOT SHARABLE\\ IS GIVEN, AND THE SAME ACTION
IS TAKEN AS IN THE CASE OF THE /^U SWITCH.  ^IT IS SUGGESTED
THAT THE /^V SWITCH BE USED WHEREVER POSSIBLE, SINCE THE SIZE OF
THE HIGH SEGMENT IS CONSIDERABLE, AND IT IS DESIRABLE THAT TWO
DIFFERENT VERSIONS OF THE COMPILER BE ABLE TO SHARE THE SAME HIGH
SEGMENT, AND THAT IDENTICAL COPIES OF THE HIGH SEGMENT NOT BE
STORED ON DISK.
.PARAGRAPH
^IF THE COMPILER SHOULD ENCOUNTER A FATAL ERROR, SUCH AS AN
ILLEGAL MEMORY REFERENCE, AND TERMINATE ABNORMALLY, IT IS POSSIBLE
TO SALVAGE THE LISTING FILE UP TO THAT POINT.  ^EXECUTE THE
COMMAND ^^REENTER\\, AND LOOK FOR A FILE 005^^IMP.TMP\\, WHERE
005 IS YOUR JOB NUMBER.
.PARAGRAPH
^IF THE MONITOR AT YOUR INSTALLATION HAS BEEN MODIFIED APPROPRIATELY,
IT WILL RECOGNIZE FILES WITH THE EXTENSION ^I^M^P AS ^I^M^P72 SOURCE
FILES, AND THE MONITOR COMMANDS ^^COMPILE, LOAD\\ AND ^^EXECUTE\\
MAY BE USED TO MANIPULATE ^I^M^P PROGRAMS.  ^THE SWITCH "/^I^M^P" MAY BE USED TO INFORM THESE COMMANDS THAT A FILE WITH
A NON-STANDARD EXTENSION DOES IN FACT CONTAIN AN ^I^M^P
PROGRAM.
.SKIP 4
.SUBTITLE 3.1.1: ^THE ^COMPILER ^LISTING.
.INDEX LISTING
.CENTER
^&3.1.1: ^THE ^COMPILER ^LISTING.\&
.SKIP
.PARAGRAPH
^THE SOURCE LISTING OF THE COMPILER HAS A NUMBER AT THE LEFT OF EACH LINE OF
CODE.  ^THIS INDICATES THE LEVEL OF PARENTHESIS NESTING AT THE BEGINNING OF THE
LINE.  ^PARENTHESES CONTAINED WITHIN _# OR ' SIGNS ARE NOT COUNTED.
.SUBTITLE 3.2: ^COMPILATION ^ERROR ^DIAGNOSTICS.
.PAGE
.INDEX ERROR DIAGNOSTICS
.CENTER
^&3.2: ^COMPILATION ^ERROR ^DIAGNOSTICS.\&
.PARAGRAPH
^THE COMPILER REPORTS ON THREE CLASSES OF ERRORS: FATAL ERRORS, ERRORS, AND
ADVISORY ERRORS.  ^ADVISORY ERRORS INDICATE A CONDITION WHICH MAY NOT BE AN ERROR
BUT SHOULD BE BROUGHT TO THE PROGRAMMER'S ATTENTION.  ^THEY ARE LABELED ^A^D^V^I^S^O^R^Y.
^FATAL ERRORS TERMINATE COMPILATION IMMEDIATELY.  ^REGULAR ERRORS DO NOT TERMINATE
COMPILATION, BUT SUBSEQUENT COMPILATION MAY BE AFFECTED.
.PARAGRAPH
^THE PHILOSOPHY BEHIND THE ERROR DIAGNOSTICS IN ^I^M^P PRESUMES A CERTAIN AMOUNT
OF MATURITY ON THE PART OF THE PROGRAMMER.  ^HE IS LESS RESTRICTED THAN IN A LANGUAGE SUCH AS ^F^O^R^T^R^A^N, BUT HE IS ALSO LESS PROTECTED FROM HIS OWN ERRORS.  ^THUS,
A NUMBER OF POTENTIAL ERROR CONDITIONS THAT MAY BE USED USEFULLY ARE NOT CHECKED
FOR BY THE COMPILER.  ^THIS IS ESPECIALLY TRUE OF SYNTAX STATEMENTS.  ^THIS IS NOT
TO IMPLY THAT FEW USEFUL DIAGNOSTICS ARE PROVIDED, HOWEVER.
.PARAGRAPH
^THE FOLLOWING ARE THE ERROR DIAGNOSTICS PROVIDED BY THE COMPILER.  ^THEY ARE
REGULAR ERRORS UNLESS OTHERWISE INDICATED.
.LEFT MARGIN 7
.SKIP
.INDENT -7
^A^T^T^E^M^P^T ^T^O ^E^X^E^C^U^T^E ^U^N^D^E^F^I^N^E^D ^S^E^M^A^N^T^I^C ^R^O^U^T^I^N^E (^FATAL):  ^IT WASN'T BAD ENOUGH YOU
REFERRED TO A NONEXISTANT SEMANTIC ROUTINE IN A SYNTAX STATEMENT (FOR
WHICH YOU ALREADY GOT AN ERROR MESSAGE).  ^YOU HAD TO GO AND TRY TO COMPILE AN INSTANCE OF THE PRODUCION.  ^THIS YOU WON'T GET AWAY WITH.
.SKIP
.INDENT -7
^B^A^D ^M^O^D^I^F^I^E^R:  ^A SEMANTIC CONDITION HAS AN IDENTIFIER WITH A BAD MODIFIER.
.SKIP
.INDENT -7
^B^A^D ^R^E^S^U^L^T ^O^F ^S^E^M^A^N^T^I^C^S; ^I^G^N^O^R^E^D (^ADVISORY):  ^A SEMANTIC ROUTINE HAS RETURNED
A VALUE FOR A SEMANTIC PART WHICH IS NOT AN OBJECT ON THE SEMANTICS
ROUTINE STACK.  ^THIS MAY OR MAY NOT CAUSE TROUBLE LATER ON.  ^IF YOU HAVE
NOT ADDED SEMANTIC ROUTINES TO THE COMPILER, REPORT THE ERROR TO THE
PERSON RESPONSIBLE FOR MAINTAINING THE COMPILER.
.SKIP
.INDENT -7
^C^A^N^N^O^T ^C^R^E^A^T^E .^R^E^L ^F^I^L^E (^FATAL): ^FOR SOME REASON, WHICH PROBABLY HAS TO DO WITH
THE OPERATING SYSTEM, A .^R^E^L FILE FOR YOUR OBJECT PROGRAM COULD NOT BE
CREATED.  ^PERHAPS ANOTHER USER IS WRITING ON THE FILE, OR THERE IS NO
SPACE AVAILABLE ON THE STORAGE DEVICE.
.SKIP
.INDENT -7
^^CALCULATED CONSTANT IS SUBSCRIPTED (A\\DVISORY): ^AN EXPRESSION HAS
BEEN EVALUATED TO A CONSTANT AND NOW AN ATTEMPT IS BEING MADE TO
SUBSCRIPT IT.  ^SINCE THE CALCULATION YIELDS ONLY ONE WORD, THIS
DOESN'T MAKE MUCH SENSE.
.SKIP
.INDENT -7
^C^A^N^N^O^T ^G^E^T ^T^W^O ^C^O^N^S^E^C^U^T^I^V^E ^R^E^G^I^S^T^E^R^S (^FATAL):  ^THE ASSEMBLER REPORTS THAT AN
OPERATION (SUCH AS DIVIDE) WHICH REQUIRES TWO CONSECUTIVE MACHINE REGISTERS WAS NOT ABLE TO FIND TWO CONSECUTIVE REGISTERS NOT IN USE.
.SKIP
.INDENT -7
^C^A^S^E ^C^O^N^T^A^I^N^S ^S^U^B^E^X^P^R^E^S^S^I^O^N ^W^H^I^C^H ^I^S ^C^A^S^E ^B^U^T ^W^O^N^T ^G^E^N^E^R^A^L^I^Z^E (^ADVISORY): ^YOU
        ARE WARNED THAT A SEMANTIC CONDITION IN A ^C^A^S^E DEFINITION CONTAINS A
SUBEXPRESSION WHICH IS ALSO AN INSTANCE OF THE PRODUCTION IN THE SYNTAX
PART.  ^THE MAIN EXPRESSION WILL GENERALIZE TO OTHER INSTANCES OF THE
^C^A^S^E, BUT THE SUBEXPRESSION WON'T.
.SKIP
.INDENT -7
^C^A^S^E ^U^N^D^E^F^I^N^E^D (^FATAL):  ^YOU TRIED TO REFERENCE A ^C^A^S^E SEMANTICS, BUT THE CASE
WAS NEVER DEFINED.
.SKIP
.INDENT -7
^C^O^D^E ^G^E^N^E^R^A^T^I^O^N ^S^T^A^C^K ^D^I^D ^N^O^T ^R^E^D^U^C^E ^T^O ^O^N^E ^I^T^E^M:  ^THE PROGRAM PARSED CORRECTLY,
BUT SEMANTICS FOR SOME OF THE PROGRAM COULD NOT BE FOUND.  ^IF YOU ADDED
YOUR OWN SYNTAX IN THE PROGRAM, CHECK IT.  ^OTHERWISE, REPORT THE PROBLEM
TO THE PERSON RESPONSIBLE FOR MAINTAINING THE COMPILER.
.SKIP
.INDENT -7
^D^E^B^U^G^G^I^N^G ^P^R^O^G^R^A^M ^N^O^T ^P^R^E^S^E^N^T (^ADVISORY):  ^A DEBUGGING SWITCH HAS CALLED FOR A
PRINTOUT NOT AVAILABLE FROM THE USER VERSION OF THE COMPILER.  ^RECOMPILE
THE PROGRAM USING THE VERSION CONTAINING THE DEBUGGING ROUTINES.
.SKIP
.INDENT -7
^D^U^P^L^I^C^A^T^E ^T^A^G:  ^THE SAME LABEL WAS USED AS A TAG IN TWO (OR MORE) PLACES.
.SKIP
.INDENT -7
^E^R^R^O^R ^C^O^R^R^E^C^T^O^R ^G^I^V^E^S ^U^P. (^FATAL): ^THE ERROR CORRECTOR WAS UNABLE TO CORRRECT A
SYNTAX ERROR.
.SKIP
.INDENT -7
^E^R^R^O^R ^C^O^R^R^E^C^T^O^R ^G^I^V^E^S ^U^P ^A^T % (^FATAL): ^THE ERROR CORRECTOR WAS UNABLE TO CORRECT
A SYNTAX ERROR, AND READ PAST THE % SIGN WHILE TRYING.
.SKIP
.INDENT -7
^E^R^R^O^R ^I^N ^A^D^D^C^H^A^R - ^N^A^M^E > 50 ^C^H^A^R^A^C^T^E^R^S:  ^A SYNTACTIC CLASS NAME IS TOO LONG.
.SKIP
.INDENT -7
^E^R^R^O^R ^I^N ^S^Y^N^T^A^X ^R^E^A^D-^I^N:  ^THERE IS A SYNTAX ERROR IN THE SYNTAX FOR SYNTAX
DURING THE FIRST STAGE OF COMPILER BOOTSTRAPPING.  ^WILL NOT OCCUR EXCEPT
WHEN COMPILER IS FIRST BEING GENERATED.
.SKIP
.INDENT -7
^F^R^E^E ^S^T^O^R^A^G^E ^E^X^H^A^U^S^T^E^D:  ^YOUR PROGRAM HAS DEMANDED MORE SPACE TO COMPILE THAN IS
AVAILABLE AS USER CORE.  ^IF YOU HAD SYNTAX ERRORS, YOU MAY BE ABLE TO
COMPILE WHEN THE ERRORS ARE REPAIRED.  ^OTHERWISE, MAKE YOUR PROGRAM
SMALLER OR FIND A BIGGER MACHINE (OR A STIFF DRINK).
.SKIP
.INDENT -7
^F^R^E^E ^S^T^O^R^A^G^E ^U^N^L^I^N^K^E^D:  ^FATAL ERROR CAUSED BY A COMPILER BUG.  ^GIVE THE LISTING
PRODUCED TO THE PERSON RESPONSIBLE FOR MAINTENANCE OF THE COMPILER.
.SKIP
.INDENT -7
^I^N ^A^R^E^G1 - ^I ^O^R ^J ^O^U^T ^O^F ^R^A^N^G^E: ^ARGUMENT TO ^A^R^E^G1 NEGATIVE OR GREATER THAN 177^B.
.SKIP
.INDENT -7
^N ^N^O^T ^A ^C^O^N^S^T^A^N^T ^I^N ^N ^L^O^N^G:  ^N MAY BE A CONSTANT EXPRESSION BUT MUST CONTAIN NO
VARIABLES (EXCEPT THOSE SYNTACTICALLY DEFINED AS CONSTANTS).
.SKIP
.INDENT -7
^N^A^M^E ^T^O^O ^L^O^N^G (^FATAL): ^YOU USED AN IDENTITFIER LONGER THAN 100 CHARACTERS IN A
SYNTACTIC CONDITION.  ^WHY?
.SKIP
.INDENT -7
^^NESTED SUBROUTINES\\: ^DUE PROBABLY TO MISMATCHED PARENTHESES, A
SUBROUTINE DEFINITION HAS BEEN INITIATED BEFORE THE PREVIOUS ONE
WAS CLOSED OUT.
.SKIP
.INDENT -7
^N^O^N-^O^C^T^A^L ^P^J ^O^R ^P^N:  ^IN ^F^I^L^E DESIGNATOR OF ^P^R^I^N^T OR ^R^E^A^D STATEMENT, THAT IS.
.SKIP
.INDENT -7
^N^U^M^B^E^R ^M^I^S^S^I^N^G ^O^R ^O^U^T ^O^F ^P^L^A^C^E ^I^N ^S^E^M^A^N^T^I^C^S ^I^D^E^N^T^I^F^I^E^R:  ^IN A SEMANTIC CONDITIONAL, YOU HAD A NUMBER IN THE WRONG FORMAT OR WRONG PLACE.
.SKIP
.INDENT -7
^O^U^T ^O^F ^R^E^G^I^S^T^E^R^S (^FATAL):  ^THE ASSEMBLER REPORTS THAT YOUR PROGRAM HAS MANAGED
TO FILL UP ALL AVAILABLE HARDWARE REGISTERS AND THEN SOME.  ^IF YOU ARE
USING EXPLICIT REGISTERS, PERHAPS YOU HAVE GENERATED AN EXPRESSION THAT
YOU THINK FITS IN ONE REGISTER BUT ISN'T COMING OUT THAT WAY.  ^IF NOT,
YOU MAY JUST HAVE A VERY COMPLICATED EXPRESSION SOMEWHERE.  ^SPLIT IT UP.
.SKIP
.INDENT -7
^P^R^E^M^A^T^U^R^E ^E^N^D ^O^F ^I^N^P^U^T ^F^I^L^E:  ^COMPILER READ THE ENTIRE INPUT FILE BUT
DID NOT ENCOUNTER THE %% WHICH TERMINATES ^I^M^P PROGRAMS.  ^PERHAPS YOU:
1. ^ONLY HAD ONE %.
2. ^FAILED TO MATCH _# OR ' WITH ANOTHER ONE, SO THAT THE % SIGN GOT
ABSORBED IN A CONSTANT/COMMENT.  ^CHECK THE NUMBERS DOWN THE LEFT
MARGIN OF THE LISTING TO SEE WHEN THEY STOPPED FOLLOWING THE
PARENTHESIS NESTING OF THE CODE.
^THE COMPILER OFFERS A CHANCE AT REDEMPTION IN THE FORM OF A PROMPT FOR
A NEW FILE NAME. ^HITTING THE ^R^E^T^U^R^N KEY WILL CAUSE THE COMPILER TO
INSERT ITS OWN %% SIGNS TO COMPLETE THE COMPILATION.
.SKIP
.INDENT -7
^P^R^O^D^U^C^T^I^O^N ^D^U^P^L^I^C^A^T^E^S ^O^N^E ^A^L^R^E^A^D^Y ^I^N ^S^Y^N^T^A^X (ADVISORY):  ^THE PRODUCTION IN A
SYNTAX STATEMENT IS IDENTICAL TO ONE ALREADY IN THE SYNTAX.  ^THIS IS
NOT AN ERROR, AND IS USED TO ADD SPECIAL SEMANTIC CASES TO ALREADY DEFINED SYNTAX.
.SKIP
.INDENT -7
^P^U^S^H^D^O^W^N ^S^T^A^C^K ^U^N^D^E^R^F^L^O^W ^E^R^R^O^R (^FATAL): ^INDICATES A COMPILER BUG.  ^INFORM THE
PERSON RESPONSIBLE FOR MAINTAINING THE COMPILER.
.SKIP
.INDENT -7
^Q^U^E^S^T^I^O^N^A^B^L^Y ^D^E^F^I^N^E^D ^V^A^R^I^A^B^L^E (^ADVISORY): ^THE INDICATED VARIABLE WAS REFERENCED
BUT NEVER (1) HAD A VALUE ASSIGNED TO IT, OR (2) APPEARED AS AN ARGUMENT OF A SUBROUTINE CALL, OR (3) WAS DECLARED ^C^O^M^M^O^N.
.SKIP
.INDENT -7
^Q^U^O^T^E^D ^S^E^M^A^N^T^I^C^S ^N^O^T ^A^N ^I^N^S^T^A^N^C^E ^O^F ^P^R^O^D^U^C^T^I^O^N:  ^A SEMANTIC CONDITION WAS NOT AN
INSTANCE OF THE PRODUCTION IN THE SYNTAX STATEMENT IN WHICH IT APPEARED.
.SKIP
.INDENT -7
^R^E^G^I^S^T^E^R ^C^O^N^F^L^I^C^T(^S) (^ADVISORY):  ^A MACHINE REGISTER WAS REFERRED TO WHICH WAS
ALREADY IN USE BY THE COMPILER.  ^THE OPERATION WAS PERFORMED AS REQUESTED, BUT PRUDENCE DICTATES A CLOSE INSPECTION OF THE ASSEMBLY LISTING
OF THE CODE GENERATED.  ^THIS MESSAGE APPEARS ONLY ONCE REGARDLESS OF THE
	NUMBER OF REGISTER CONFLICTS, AND IS FOLLOWED ON THE LIST FILE
BY ERROR MESSAGES FOR EACH CONFLICT, INDICATING THE REGISTER
INVOLVED AND THE ADDRESS OF THE FIRST REFERENCE PRODUCING A
CONFLICT, RELATIVE TO THE BEGINNING OF THE OBJECT CODE.
.SKIP
.INDENT -7
^S^E^M^A^N^T^I^C^S ^S^T^A^C^K ^O^V^E^R^F^L^O^W (^FATAL): ^CONGRATULATIONS!  ^THERE IS EXACTLY ONE MAJOR
TABLE IN THE COMPILER WHICH IS NOT DYNAMICALLY EXPANDABLE, AND ^Y^O^U^R
PROGRAM HAS STUFFED IT FULL.  ^THIS CAN ONLY HAPPEN THROUGH THE USE OF
A VERY COMPLEX SEMANTIC ROUTINE CALL IN A SEMANTICS PART OF A SYNTAX
STATEMENT, OR MAYBE A BUG IN A SEMANTIC ROUTINE, OR A VERY LONG LIST
OF NAMES IN YOUR PROGRAM.  ^COGNOSCENTI WILL APPRECIATE THE INFORMATION THAT THIS MAY RESULT FROM LOTS OF CALLS TO ^E^N^S^T^A^C^K IN ONE
SEMANTICS.
.SKIP
.INDENT -7
^S^T^A^C^K ^U^N^D^E^R^F^L^O^W ^I^N ^F^S^U^B (^FATAL): ^INDICATES A COMPILER BUG.  ^INFORM THE PERSON
RESPONSIBLE FOR MAINTAINING THE COMPILER.
.SKIP
.INDENT -7
^^SUBSCRIPTED REGISTER - IGNORED:\\ ^THE SUBSCRIPT ON A REGISTER IS
DISREGARDED.
.SKIP
.INDENT -7
^S^Y^N^T^A^C^T^I^C ^A^M^B^I^G^U^I^T^Y; ^U^N^R^E^S^O^L^V^E^D ^A^T %:  ^THE PARSER HAS FOUND A SYNTACTIC AMBIGUITY WHICH IT WAS NOT ABLE TO RESOLVE BY THE END OF YOUR PROGRAM.  ^IF
YOUR PROGRAM CONTAINS SYNTAX STATEMENTS, CHECK THEM; OTHERWISE REPORT
THE ERROR TO THE PERSON RESPONSIBLE FOR MAINTAINING THE COMPILER.
.SKIP
.INDENT -7
^^SYNTACTIC AMBIGUITY:\\ ^THE COMPILER WAS ABLE TO INTERPRET A
PORTION OF YOUR PROGRAM IN TWO CONFLICTING WAYS, AND WAS NOT ABLE
TO DECIDE WHICH WAY YOU HAD IN MIND.  ^THE AMBIGUOUS SEGMENT OF THE
PROGRAM IS INDICATED ON THE LISTING (AFTER A FASHION) BY A LIST OF
THE IDENTIFIERS (VARIABLE NAMES AND CONSTANTS) WHICH APPEAR
IN THE SEGMENT, PRINTED IN REVERSE ORDER.  ^SOME CONSTRUCTS
WHICH MAY PRODUCE THIS ERROR ARE: ^^A=>B=>C ELSE D\\, WHICH IS REALLY
AMBIGUOUS AND SHOULD BE PARENTHESIZED EXPLICITLY, AND ^^(A RELOP B)=>C,\\
WHERE ^^RELOP\\ IS ANY RELATIONAL OPERATOR, WHICH IS NOT AMBIGUOUS,
AND WILL GENERATE CORRECT CODE, BUT THE PARENTHESES MAY BE REMOVED TO
GET RID OF THE ERROR MESSAGE.
.SKIP
.INDENT -7
^S^Y^N^T^A^X ^E^R^R^O^R:  ^THE PARSER HAS NOT BEEN ABLE TO INTERPRET YOUR PROGRAM AS A LEGAL
^I^M^P EXPRESSION.  ^IT HAS ATTEMPTED TO CONTINUE THE COMPILATION BY REPLACING PART OF YOUR PROGRAM AT THE POINT OF THE ERROR BY WHAT IT HOPES IS
IS A CORRECTION OF THE ERROR.  ^IT IS POSSIBLE THAT MORE ERRORS WILL
RESULT FROM THIS CORRECTION LATER ON.  (^ON THE OTHER HAND, IN CONTRAST
TO THE PREVIOUS ^P^D^P-10 ^I^M^P COMPILER, WHICH QUIT AT THE FIRST ERROR,
THERE WILL AT LEAST ^B^E A LATER ON.)
.INDENT 3
^THE OFFENDING LINE WILL BE TYPED ON YOUR TELETYPE, WITH A LINE FEED
INSERTED AT THE POINT AT WHICH THE ERROR WAS DETECTED.
.INDENT 3
^SYNTAX ERRORS ARE HANDLED BY THE ERROR-CORRECTING ROUTINE,
WHICH MAY TAKE SOME TIME ON CERTAIN ERRORS.  ^WHEN THE ERROR
HAS BEEN CORRECTED, TWO ASTERISKS ARE PRINTED AFTER THE MESSAGE
^^** SYNTAX ERROR\\.  ^IF THIS SEEMS TO BE TAKING AN UNDULY LONG
TIME, YOU MAY WANT TO  CONTROL-^C,
EXECUTE THE COMMAND ^R^E^E, AND THEN LOOK FOR A FILE NAMED 005^^IMP.TMP\\ (WHERE 005 IS YOUR JOB NUMBER), WHICH CONTAINS YOUR LISTING UP TO
THE POINT OF THE ERROR.
.SKIP
.INDENT -7
^T^O^O ^M^A^N^Y ^A^R^G^S ^T^O ^S^E^M^A^N^T^I^C ^R^T^N ^O^R ^P^A^R^A^M ^S^T^A^C^K ^U^N^D^E^R^F^L^O^W (^FATAL): ^EITHER YOU TRIED
TO EXECUTE A SEMANTIC ROUTINE WITH MORE THAN 10 ARGUMENTS, OR ELSE THERE
IS A COMPILER BUG.
.SKIP
.INDENT -7
^T^O^O ^M^A^N^Y ^L^O^C^A^L ^S^Y^M^B^O^L^S ^I^N ^R^E^F^E^R^E^N^C^E^D ^S^E^M^A^N^T^I^C^S (^FATAL):  ^YOU TRIED TO REFERENCE
QUOTED SEMANTICS WITH MORE THAN 10 LOCAL SYMBOLS.
.SKIP
.INDENT -7
^T^O^O ^M^A^N^Y ^R^E^F^E^R^E^N^C^E^S ^T^O ^O^N^E ^R^E^G^I^S^T^E^R (^FATAL):  ^EITHER YOU HAVE DEVISED A WAY TO
REFER TO A REGISTER OR REGISTER VARIABLE FOUR THOUSAND NINETY-SIX TIMES
IN YOUR PROGRAM (UNLIKELY), OR ELSE A LINKED LIST OF OBJECT CODE HAS
GOTTEN TIED INTO A LOOP (REGRETTABLE, BUT CONCEIVABLE).  ^IF THE LATTER
        IS THE CASE, REPORT TO THE PERSON RESPONSIBLE FOR MAINTAINING THE
COMPILER. ^THIS ERROR HAS ALSO BEEN KNOWN TO CROP UP WHEN PROGRAMS WHICH
HAVE SYNTACTIC ERRORS ARE BEING COMPILED. ^ALTHOUGH THE ERROR
CORRECTOR ALWAYS MAKES CORRECTIONS WHICH ARE ^S^Y^N^T^A^C^T^I^C^A^L^L^Y ^C^O^R^R^E^C^T,
THERE IS NO GUARANTEE THAT THEY WILL ALWAYS BE ^S^E^M^A^N^T^I^C^A^L^L^Y
^M^E^A^N^I^N^G^F^U^L. ^IF YOU GET THIS ERROR MESSAGE AND YOUR PROGRAM CONTAINS
SYNTACTIC ERRORS, CORRECT THE ERRORS AND RE-COMPILE. ^THIS ERROR
MESSAGE SHOULD GO AWAY.
.SKIP
.INDENT -7
^T^O^O ^M^A^N^Y ^S^Y^N^T^A^X ^E^R^R^O^R^S (^FATAL): ^A LARGE NUMBER OF SYNTAX ERRORS HAVE BEEN DETECTED IN YOUR PROGRAM, AND THE COMPILER SEES NO POINT IN PROCEEDING.
.SKIP
.INDENT -7
^T^W^O ^L^E^N^G^T^H^S ^I^N ^S^A^M^E ^D^E^C^L^A^R^A^T^I^O^N:  ^TWO LENGTHS IN SAME DECLARATION.
.SKIP
.INDENT -7
^V^A^L^U^E ^N^O^T ^A ^C^O^N^S^T^A^N^T:  ^VALUE IN ^V^A^L^U^E SEMANTICS MUST BE AN 18-BIT CONSTANT.
.SKIP
.INDENT -7
^V^E^C^T^O^R ^A^P^P^E^A^R^S ^I^N ^M^O^R^E ^T^H^A^N ^O^N^E ^D^E^C^L^A^R^A^T^I^O^N:  ^THE SAME VARIABLE NAME WAS
DECLARED ^N ^L^O^N^G MORE THAN ONCE.
.LEFT MARGIN 0
.SUBTITLE 3.3: ^LOADING AND ^RUNNING.
.PAGE
.INDEX LOADING OBJECT PROGRAMS
.INDEX RUNNING OBJECT PROGRAMS
.CENTER
^&3.3: ^LOADING AND ^RUNNING.\&
.SKIP
.PARAGRAPH
^ON ^D^E^CSYSTEM-10, YOU MAY LOAD AND RUN YOUR OBJECT PROGRAMS
BY USING THE APPROPRIATE MONITOR COMMAND (.^E^X, .^L^O^A^D OR .^D^E^B),
WITH A LIST OF THE FILES YOU WISH TO LOAD.
^FILE ^^IMPLIB.LIB\\ SHOULD BE LOADED IN
LIBRARY SEARCH MODE.  ^EXAMPLE:
.SKIP
.CENTER
^^.EX URPROG.REL,URSUBR.REL,/LIBRARY,IMPLIB.LIB\\
.PARAGRAPH
^ON ^^TENEX\\, ^I^M^P OBJECT PROGRAMS MUST BE LOADED
BY THE ^^LOADER\\ SUBSYSTEM, AND RUN WITH THE ^^START\\ COMMAND.
^SEE THE ^^TENEX U\\SER'S ^GUIDE AND THE ^D^E^CSYSTEM-10 ^ASSEMBLY
^LANGUAGE ^HANDBOOK FOR MORE INFORMATION ON THE LOADER.
.PARAGRAPH
^IF YOUR PROGRAM DOES ANY ^I/^O, IT SHOULD CALL ^F^I^N^I (SEE
^SECTION 2.2.7) TO COMPLETE THE ^I/^O OPERATIONS.
.PARAGRAPH
^IF YOUR PROGRAM SHOULD BOMB OUT, THE MONITOR COMMAND .^R^E^E WILL USUALLY CLOSE
OUT YOUR FILES WITHOUT LOSING ANY OUTPUT.
^D^D^T USERS MAY ACTIVATE THE SYMBOL TABLE USING THE NAME OF THE 
^^.REL\\ FILE.  ^THIS IS THE NAME SPECIFIED IN THE ^^CALL ME\\
STATEMENT, IF THERE WAS ONE IN THE SOURCE FILE, OR ELSE THE
NAME OF THE SOURCE FILE.
.PARAGRAPH
.INDEX ^D^D^T SYMBOL TABLE ACTIVATION
.SKIP 4
.SUBTITLE 3.4:     ^MAKING A ^NEW ^COMPILER.
.CENTER
^&3.4:     ^MAKING A ^NEW ^COMPILER.\&
.SKIP
.PARAGRAPH
^IF IT IS DESIRED TO CREATE A NEW ^I^M^P72 COMPILER FROM SCRATCH, THE FOLLOWING
PROCEDURE SHOULD BE FOLLOWED:
.LEFT MARGIN 7
.SKIP
.INDENT -3
1.  ^MAKE A VERSION OF THE COMPILER CONTAINING THE SYNTAX ON
FILE ^^IMPSYN.IMP\\.  ^THIS SYNTAX IS NECESSARY TO COMPILE EACH COMPILER
SUBROUTINE.  ^THE WAY TO MAKE THE VERSION OF THE COMPILER IS: RUN THE
COMPILER.  RESPOND TO THE * PROMPT WITH ^^IMPSYN.IMP/C\\.  ^WHEN ANOTHER
* PROMPT IS GIVEN, TYPE /^V.  ^THE COMPILER WILL EXIT TO MONITOR
LEVEL.  ^TYPE ^^SSAVE FOO\\.  ^NOW YOU HAVE A VERSION OF THE
COMPILER NAMED ^F^O^O.
^USE IT TO COMPILE THE SOURCE FILES FOR THE COMPILER.
^BE SURE TO SPECIFY THE COMPILER SWITCH /^R WHEN COMPILING
EACH SOURCE FILE, IN ORDER TO GENERATE A SHARABLE HIGH SEGMENT
FOR THE COMPILER.
.SKIP
.INDENT -3
2. ^LOAD AND EXECUTE ALL .^R^E^L FILES FOR THE COMPILER, TOGETHER WITH THE
^I^M^P ^I/^O LIBRARY (^I^M^P^L^I^B.^L^I^B).  ^IF YOU DESIRE A COMPILER WITH THE
COMPILER DEBUGGING FACILITIES, LOAD ^D^E^B^U^G.^R^E^L;  OTHERWISE IGNORE
THE RESULTING UNDEFINED GLOBALS AND CHARGE ON.  ^IN ANY EVENT, IGNORE
THE UNDEFINED GLOBAL ^P^E^E^K, WHICH WILL NOT BE CALLED (EXCEPT ON THE
^YALE COMPUTER).  ^THE FILE ^R.^C^M^D MAY BE USED TO LOAD THE COMPILER BY
THE ^D^E^CSYSTEM-10 COMMAND ^^LOAD @R\\, OR THE COMMAND STRING
^^R.CMD@<ALTMODE>\\ TO THE ^^TENEX LOADER\\ SUBSYSTEM.
.SKIP
.INDENT -3
3. ^THE COMPILER WILL START BY READING PART OF FILE ^S^Y^N^T^A^X, AND THEN COME
BACK WITH A ^S^Y^N^T^A^X ^B^O^O^T^S^T^R^A^P^P^E^D MESSAGE AND AN ASTERISK.
  ^TELL IT TO
COMPILE THE REST OF THE SYNTAX ON ^S^Y^N^T^A^X BY TYPING /^C<^C^R>
.SKIP
.INDENT -3
4. ^WHEN (AFTER SEVERAL MINUTES) THE COMPILER RETURNS ANOTHER ASTERISK, YOU
MAY TYPE /^V<^C^R>, AND THEN SAVE THE CORE IMAGE, WHICH IS NOW AN ^I^M^P72
COMPILER.
.SKIP
.INDENT -3
5 ^IF YOU WISH TO ADD NEW SYNTAX, SAY ON FILE ^N^E^W^S^Y^N, INSTEAD OF /^V TYPE
^N^E^W^S^Y^N/^C<^C^R>, AND PROCEED TO STEP 4.
.LEFT MARGIN 0
.SUBTITLE 4: ^INTERNAL ^DOCUMENTATION OF THE ^I^M^P72 ^COMPILER.
.PAGE
.INDEX INTERNAL DOCUMENTATION
.CENTER
^&4: ^INTERNAL ^DOCUMENTATION OF THE ^I^M^P72 ^COMPILER.\&
.PARAGRAPH
^THIS SECTION PROVIDES AN OVERVIEW OF THE ORGANIZATION OF THE ^I^M^P72 COMPILER.
^DOCUMENTATION OF SPECIFIC ROUTINES, DATA BASES, ETC., IS INCLUDED AT THE BEGINNING OF EACH FILE OF SOURCE CODE.  ^THE INTENT OF THE PRESENT SECTION IS TO
PROVIDE A FRAME OF REFERENCE FOR THE READER WHO WISHES TO TINKER WITH THE COMPILER.
^FOR THOSE WITH A MORE INTELLECTUAL INTEREST IN THE COMPILER'S
WORKINGS AND DESIGN, [^BILOFSKY 1973], [^IRONS 1971] AND
[^WEINGART 1973] MAY BE MORE EDIFYING.
.PARAGRAPH
^THE COMPILER IS PROGRAMMED MODULARLY WHEREVER POSSIBLE, AT SOME COST IN
EFFICIENCY.  (^T\HIS COST HAS BEEN SUBSTANTIALLY REDUCED BY REPLACING MANY
SUBROUTINE CALLS BY IN-LINE SYNTACTIC MACROS.)  ^THIS PHILOSOPHY
WAS ADOPTED IN ORDER TO ENABLE REPLACEMENT AND MODIFICATION OF PORTIONS OF THE COMPILER WITH MINIMAL REPERCUSSIONS.  ^ACCORDINGLY,
THERE IS NO COMMON DATA BASE IN THE COMPILER (MINOR EXCEPTIONS EXIST
FOR THE SAKE OF EFFICIENCY IN THE ASSEMBLY PHASE).  ^NECESSARY INFORMATION
CONCERNING ANOTHER MODULE'S DATA BASE IS ACQUIRED VIA SUBROUTINE CALLS.
.PARAGRAPH
^THE COMPILER MAY BE DIVIDED CONCEPTUALLY INTO THE FOLLOWING SECTIONS:
.RIGHT MARGIN 70
.PAGE
.NOFILL
^S^O^U^R^C^E  ^D^A^T^A ^B^A^S^E                ^F^U^N^C^T^I^O^N^S
^F^I^L^E^S
.SKIP
-------------------------------------------------------------
.SKIP
^I. ^HOUSEKEEPING.
.SKIP
^F^R^E^E    ^FREE STORAGE.   ^FREE STORAGE MODULE.  ^MAINTAINS FREE
                        STORAGE, WHICH IS DYNAMICALLY ALLOCA-
                        TED AND USED FOR VIRTUALLY ALL TABLES.
.SKIP
 ^D^I^R     ^DIRECTORY.      ^DIRECTORY MODULE.
.SKIP
^S^T^A^C^K   ^SEMANTIC ROU-   ^SEMANTIC STACK MODULE.  ^MAINTAINS A
       TINES' STACK     STACK FOR PARAMETERS OF SEMANTIC RTNS.
.SKIP
"      (PROVIDED       ^BIT MATRIX MODULE.  ^CREATES AND ACCES-
        BY CALLER)      SES ARBITRARY BIT MATRICES.
.SKIP
"      ^PUSHDOWN STACK  ^PUSHDOWN STACK MODULE.  ^PROVIDES A ^P^D
                        STACK FOR ANYONE WHO WANTS.
.SKIP
^I^M^P     (NONE)          ^DRIVER PROGRAM.
.SKIP
^D^E^B^U^G                   ^DEBUGGING MODULE, WHICH MAY BE LOADED
                       AT COMPILER GENERATION TIME.
.SKIP
^P^M^O^D                   ^FORMATTED PRINT MODULE.
.SKIP
-------------------------------------------------------------
.SKIP
^I^I. ^HOUSEKEEPING _& ^PARSING.
.SKIP
^L^E^X                     ^INPUT AND LEXICAL ANALYZER.
.SKIP
^R^S^Y^N                    ^SYNTAX BOOTSTRAP ROUTINE, AND SEMANTICS
 _& ^R^S^Y^N2                  FOR SYNTAX STATEMENTS.
.SKIP
-------------------------------------------------------------
.SKIP
^I^I^I. ^PARSING.
.SKIP
^P^A^R^S^E   ^PARSE ARRAYS.   ^PARSE MODULE. ^CALLS HEAVILY UPON ^G^R^A^P^H
                        AND ^E^R^C^O^R.
.SKIP
^E^R^C^O^R   ^PARSE ARRAYS.   ^ERROR CORRECTION AND SYNTACTIC DISAM-
                        BIGUATION.
.SKIP
^G^R^A^P^H   ^SYNTAX GRAPH _&  ^SYNTAX GRAPH MODULE.  ^CONSTRUCTS AND
        CONNECTIVITY    ACCESSES THE SYNTAX DATA BASE.
        MATRICES.
.PAGE
^I^V. ^SEMANTICS.
.SKIP
^E^N^T^R^E^E  ^CODE GENERATION ^CODE TREE MODULE.  ^BUILDS AND ACCESSES
        TREE.           CODE GENERATION TREE.
.SKIP
^C^O^T^R^E^E  ^CODE            ^CODE GENERATION MODULE.  ^CALLS HEAVILY
        GENERATION      ON CODE TREE MODULE.  ^DOES CODE TREE
        STACK.          MATCHING _& INVOKES SEMANTIC ROUTINES.
                        ^MAINTAINS CODE GENERATION STACK.
.SKIP
^D^O^S^E^M   ^SEMANTICS       ^SEMANTICS MODULE.  ^BUILDS AND ACCESSES
                        SEMANTICS ARRAY.  ^OVERSEES SEMANTICS
                        STACK.
.SKIP
-------------------------------------------------------------
.SKIP
^V. ^SEMANTICS _& ^CODE ^GENERATION.
.SKIP
^C^O^D^E    ^ENTRIES IN      ^SEMANTIC ROUTINES, MOSTLY TARGET-
 _& ^C^O^D^E2  SEMANTICS       MACHINE-DEPENDANT.  ^GENERATE INTER-
 _& ^C^O^D^E3  STACK; CODE     MEDIATE FORMAT OBJECT CODE.
        ARRAYS.
.SKIP
^I^M^P^S^E^M  ^CODE AND REG-   ^MACHINE-INDEPENDANT SEMANTIC ROUTINES.
        ISTER ARRAYS.   ^DECLARATIONS AND REGISTER ASSIGNMENT.
.SKIP
-------------------------------------------------------------
.SKIP
^V^I. ^CODE ^GENERATION AND ^HOUSEKEEPING.
.SKIP
^A^M^O^D    ^CODE ARRAY.     ^ASSEMBLY MODULE.  ^PERFORMS SOME FINAL
                                          CODE OPTIMIZATION.
.SKIP
^R^M^O^D    ^REGISTER ARRAY. ^REGISTER ALLOCATION MODULE.
.SKIP
^O^M^O^D    ^O\BJECT CODE.    ^RELOCATABLE FILE GENERATION MODULE.
.RIGHT MARGIN 60
.FILL

.SUBTITLE 4.1: ^PARSING.
.PAGE
.CENTER
^&4.1: ^PARSING.\&
.SKIP
.PARAGRAPH
^THE GENERAL FLOW OF CONTROL WITHIN THE COMPILER IS AS FOLLOWS:  ^P^A^R^S^E
OBTAINS A STREAM OF INPUT SYMBOLS (IN THE FORM OF DIRECTORY INDICES) FROM ^L^E^X,
AND PRODUCES A STREAM OF PARSER OUTPUT IN THE FORM OF TERMINAL SYMBOLS (NEGATIVE
DIRECTORY INDICES) AND PRODUCTION NUMBERS (POSITIVE INTEGERS N, CONVENTIONALLY
INDICATED BY [N].  ^IN FACT, N IS AN INDEX IN THE SEMANTICS ARRAY, FOR HISTORICAL
REASONS, BUT NEED NOT BE.).  ^THE PARSER OUTPUT IS IN ^POLISH ^POSTFIX FORM.
.PARAGRAPH
^THE PARSER IS A BOTTOM-UP PARSER (^IRONS 1971), DRIVEN THROUGH ONE CYCLE BY
.INDEX PARSER
EACH INPUT SYMBOL.  ^AT THE END OF THE CYCLE, IT HAS A SET OF POSSIBLE PARSES FOR
THE INPUT STRING SO FAR.  ^IT TAKES ONE OF THE FOLLOWING ACTIONS, DEPENDING ON
THE NUMBER OF PARSES IN THE SET.
.LEFT MARGIN 7
.SKIP
.INDENT -3
1. ^IF THERE ARE NO PARSES, A SYNTAX ERROR HAS OCCURRED.  ^E^R^C^O^R IS CALLED
TO GENERATE A STRING OF SYMBOLS WHICH MAY BE INSERTED INTO THE PARSE
TO FORM A SYNTACTICALLY CORRECT EXPRESSION.  (^E^R^C^O^R USES THE PHILOSOPHY, BUT NOT THE EXACT METHOD, OF (^IRONS 1963)).
.SKIP
.INDENT -3
2. ^IF THERE IS MORE THAN ONE PARSE, ^A^M^B^I^G IS CALLED TO DECIDE IF AN AMBIGUITY HAS GENERATED MULTIPLE PARSES, AND TO DISCARD THE REDUNDANT PARSES IF THIS IS THE CASE.
.SKIP
.INDENT -3
3. ^IF THERE IS ONE UNIQUE PARSE, THE PORTION OF THE PARSER OUTPUT STREAM
GENERATED SINCE THE LAST TIME THERE WAS ONE UNIQUE PARSE IS PASSED TO
THE SEMANTICS PORTION OF THE COMPILER BY CALLING ^C^O^T^R^E^E.
.LEFT MARGIN 0
.PARAGRAPH
^ALL OTHER FUNCTIONS PERFORMED BY THE COMPILER, INCLUDING ADDITION OF SYNTAX
AND SEMANTICS TO THE COMPILER TABLES, AND INVOKING THE ASSEMBLY PHASE, ARE PERFORMED BY SEMANTIC ROUTINES INVOKED BY THE PRODUCTIONS WHICH ^P^A^R^S^E PASSES TO
^C^O^T^R^E^E FOR INTERPRETATION.  ^THUS THE ENTIRE FLOW OF CONTROL OF THE COMPILER IS
DIRECTED BY THE SYNTAX AND SEMANTICS OF THE LANGUAGE.
.SUBTITLE 4.2: ^SEMANTICS.
.PAGE
.CENTER
^&4.2: ^SEMANTICS.\&
.PARAGRAPH
^C^O^T^R^E^E MAINTAINS A CODE GENERATION STACK, WHICH STARTS OFF AS THE PARSER
OUTPUT IN POSTFIX FORM, BUT IS COLLAPSED AS THE PRODUCTIONS IN THE STACK ARE
APPLIED TO THEIR ARGUMENTS, BY INVOKING THE APPROPRIATE SEMANTICS FOR THE PRODUCTIONS, TO PRODUCE A SINGLE STACK ENTRY (SEMANTIC OBJECT) WHICH IS INSERTED
BACK IN THE STACK IN PLACE OF THE PRODUCTION AND ITS ARGUMENTS.  ^THIS COULD
ALWAYS BE BE DONE AT THE BOTTOM OF THE STACK (WE WILL CONSIDER THE WORKING END
TO BE THE BOTTOM), AS SOON AS THE PARSER SUPPLIED A PRODUCTION, WERE IT NOT
FOR THE SPECIAL SEMANTIC CASES.  ^THESE REQUIRE THAT A PRODUCTION NOT BE APPLIED
TO ITS ARGUMENTS UNTIL ENOUGH ADDITIONAL PARSER OUTPUT HAS BEEN SUPPLIED TO
ENSURE THAT THE PRODUCTION IS NOT PART OF SOME SPECIAL CASE.
.PARAGRAPH
^IN ORDER TO DO THIS, ALL SPECIAL CASES ARE KEPT IN A CODE GENERATION TREE,
WHICH IS BUILT AND ACCESSED BY ROUTINES IN THE CODE TREE MODULE, ^E^N^T^R^E^E.  ^THE
SPECIAL CASES ARE ENTERED IN THE TREE AS NODES WHICH MAY MATCH EITHER A PARTICULAR CLASS OF OBJECTS (AS SPECIFIED BY THE MODIFIERS IN THE SEMANTIC CONDITION SEE ^SECTION 2.3.3.2), OR A PARTICULAR PRODUCTION.  ^WHEN A NEW SUCCESSOR IS ADDED
TO A NODE, IT IS CAREFULLY INSERTED AMONG EXISTING SUCCESSORS SO THAT THE ORDER
OF SUCCESSORS OF A NODE, FROM LEFT TO RIGHT, IS IN ORDER OF INCREASING GENERALITY.  ^THIS IS DONE BY ^E^N^T^R^E^E, AND BY SUBROUTINES ^I^N^S^N^O AND ^C^O^M^P^N^O.  ^THIS ORDER
INSURES THAT THE MOST SPECIFIC CASE IN THE TREE IS THE ONE TO MATCH A GIVEN
PIECE OF PARSER OUTPUT (SUBJECT TO THE DIFFICULTIES MENTIONED IN ^SECTION 2.3.5),
SINCE NODES ARE SEARCHED LEFT-TO-RIGHT WHILE ATTEMPTING A MATCH.
.INDEX \\SPECIAL CASES, IMPLEMENTATION OF
.PARAGRAPH
^THE DEFINITION OF UNCONDITIONAL SEMANTICS FOR A PRODUCTION CAUSES THE MOST
GENERAL POSSIBLE CASE OF THAT PRODUCTION TO BE ENTERED IN THE CODE GENERATION
TREE, ENSURING THAT IF NO SPECIAL CASE IS FOUND THE SEMANTICS FOR THE GENERAL
CASE WILL BE INVOKED.
.PARAGRAPH
^THE TERMINAL NODES OF THE CODE GENERATION TREE MUST ALWAYS MATCH SOME PRODUCTION.  ^IN ORDER TO AVOID EXCESSIVE FANOUT TO THESE NODES, THE TERMINAL NODES
COMING FROM ANY GIVEN NODE ARE CONDENSED INTO ONE.  ^THE ENTRY FOR EACH PRODUCTION IN THE SEMANTICS ARRAY CONTAINS A POINTER TO A LIST FOR THAT PRODUCTION, IN
THE ARRAY ^P^R^O^S^E^M (PART OF THE SEMANTICS MODULE), CONTAINING THE NAMES OF ALL THE
TERMINAL NODES IN THE CODE GENERATION TREE WHERE THAT PRODUCTION MAY MATCH, AND
A POINTER BACK TO THE SEMANTICS ARRAY ENTRY FOR THE SEMANTICS TO BE INVOKED AT
THAT NODE.  ^THE ^P^R^O^S^E^M ENTRY FOR A PRODUCTION ALSO CONTAINS A BIT VECTOR TELLING
AT WHICH LEVELS OF THE CODE GENERATION TREE THE PRODUCTION MAY MATCH SOME NODE,
EITHER TERMINAL OR OTHERWISE.  ^THIS INFORMATION MAKES IT POSSIBLE FOR ^C^O^T^R^E^E TO
ASCERTAIN IN MANY CASES THAT NO MATCH IS POSSIBLE STARTING AT A GIVEN POINT IN
THE CODE GENERATION STACK, WITHOUT HAVING TO SEARCH THE ENTIRE TREE.
.PARAGRAPH
^CERTAIN NON-TERMINAL NODES IN THE CODE GENERATION TREE MAY MATCH A CLASS OF
PRODUCTIONS DEFINED BY A ^V^A^L^U^E KLUDGE.
.PARAGRAPH
^C^O^T^R^E^E PERFORMS THE FOLLOWING ALGORITHM:  ^IT IS CALLED ONCE FROM ^P^A^R^S^E WITH
EACH ITEM OF PARSER OUTPUT.  ^THE ITEM IS ADDED TO THE BOTTOM OF THE CODE GENERATION STACK.  ^IF IT IS A TERMINAL SYMBOL, NO OTHER ACTION IS TAKEN.  ^IF IT IS A
PRODUCTION NUMBER, AN ATTEMPT IS MADE TO MATCH SOME SUBSTRING IN THE STACK WITH
SOME PATTERN IN THE CODE GENERATION TREE.  ^A MATCH IS ATTEMPTED STARTING AT
EACH NODE IN THE STACK, STARTING AT THE TOP.
.LEFT MARGIN 7
.SKIP
.INDENT -3
1. ^IF A MATCH IS FOUND WHICH MIGHT BE CONTINUED PAST THE END OF THE STACK,
NO ACTION IS TAKEN, AND ^C^O^T^R^E^E RETURNS CONTROL TO THE PARSER FOR MORE
PARSER OUTPUT.  ^IN THIS CASE, MORE CONTEXT IS NEEDED TO DETERMINE
WHETHER THIS IS A SPECIAL CASE.
.SKIP
.INDENT -3
2. ^IF NO MATCH IS FOUND AT ANY POSITION, ANOTHER SYMBOL IS REQUESTED FROM
THE PARSER.  ^THIS IS IN FACT AN ERROR CONDITION, BUT IS NOT CHECKED FOR
UNTIL COMPLETION OF THE PARSE.
.SKIP
.INDENT -3
3. ^IF A MATCH IS FOUND, ALL THE WAY THROUGH TO A TERMINAL NODE OF THE CODE
GENERATION TREE, THE APPROPRIATE SEMANTICS ARE APPLIED.
.LEFT MARGIN 0
.PARAGRAPH
^THE SEMANTICS ARE APPLIED BY MOVING THE OBJECTS IN THE MATCHED SECTION OF
THE STACK ONTO THE SEMANTICS STACK, AND CALLING THE SEMANTICS MODULE, ^D^O^S^E^M,
WITH THE INDEX IN THE SEMANTICS ARRAY OF THE SEMANTICS TO BE INVOKED.  ^D^O^S^E^M
WILL USUALLY SUPPLY A SINGLE OBJECT AS THE RESULT OF THE SEMANTICS.  ^C^O^T^R^E^E THEN
INSERTS THIS OBJECT INTO THE STACK IN PLACE OF ALL THE OBJECTS AND PRODUCTIONS
MATCHED, AND GOES BACK TO LOOK FOR ANOTHER PATTERN MATCH.
.PARAGRAPH
^QUOTED SEMANTICS ARE STORED IN THE SEMANTICS ARRAY ESSENTIALLY AS PARSER
OUTPUT, WITH SPECIAL INDICATORS FOR LOCAL SYMBOLS AND FOR PLACES WHERE THE ARGUMENTS ARE TO BE INSERTED (COPYING THE ASSOCIATED CODE, IF ANY, FOR ALL BUT THE
FIRST INSERTION OF EACH ARGUMENT).  ^D^O^S^E^M PERFORMS QUOTED SEMANTICS BY CALLING
^C^O^D^E^N^T, IN THE CODE GENERATION STACK PACKAGE, TO ADD EACH ITEM IN THE QUOTED
SEMANTICS ONTO THE BOTTOM OF THE CODE GENERATION STACK.  ^C^O^D^E^N^T ALSO SETS A FLAG
FOR ^C^O^T^R^E^E, SO THAT WHEN ^D^O^S^E^M RETURNS CONTROL TO ^C^O^T^R^E^E SPECIAL ACTION IS TAKEN
TO REARRANGE THE STACK SO THAT THE ENTIRE RESULT OF THE QUOTED SEMANTICS IS
INSERTED IN PLACE OF THE MATCHED PORTION OF THE STACK.  ^THUS, IT IS QUITE POSSIBLE TO HAVE SEMANTICS GENERATE MORE ITEMS ON THE STACK THAN WERE NECESSARY TO
INVOKE IT.  ^THIS PROCESS IS USED IN THE SEMANTICS FOR ^I^M^P72 CONDITIONALS, WHERE
SEVERAL QUOTED SEMANTIC REWRITES OF A CONDITIONAL EXPRESSION MAY BE USED TO PUT
IT INTO A FORM WHICH GENERATES GOOD OBJECT CODE.
.PARAGRAPH
^THERE IS ALSO A SPECIAL SWITCH IN ^C^O^T^R^E^E WHICH CAUSES IT NOT TO ENTER THE
PARSER OUTPUT IN THE CODE GENERATION STACK AT ALL, BUT RATHER TO STORE IT IN AN
ARRAY FOR LATER INTERPRETATION BY CERTAIN SEMANTIC ROUTINES.  ^THE SEMANTIC ROUTINES ^M^A^X^W^E^L^L AND ^M^A^X^E^N^D TURN THIS SWITCH ON AND OFF REPSECTIVELY, THE PRODUCTION INVOKING THE LATTER MAKING USE OF THE ^P^R^I^O^R^I^T^Y MECHANISM TO AVOID BEING
STORED AND IGNORED ITSELF.  ^THIS MECHANISM IS USED TO IMPLEMENT QUOTED SEMANTICS
AND SEMANTIC CONDITIONALS.
.SKIP 4
.SUBTITLE 4.3: ^SEMANTICS AND ^CODE ^GENERATION.
.CENTER
^&4.3: ^SEMANTICS AND ^CODE ^GENERATION.\&
.SKIP
.PARAGRAPH
^SEMANTIC ROUTINES ARE INVOKED BY ^D^O^S^E^M, WHICH MERELY INTERPRETS THE ENTRIES
IN THE SEMANTICS ARRAY.  ^THE ROUTINE IS COMPLETELY EXPLAINED BY THE DATA STRUCTURE, WHICH IS WELL-DOCUMENTED ON THE SOURCE FILE.
.PARAGRAPH
(^THE CONFUSING ROUTINES IN THE SEMANTICS PACKAGE, AND THERE ARE VERY CONFUSING ONES INDEED, HAVE TO DO WITH THE SEMANTICS FOR SYNTAX, WHICH IS DISCUSSED
BELOW.)
.SUBTITLE 4.4: ^HOW ^EXTENSIBILITY IS ^IMPLEMENTED.
.PAGE
.INDEX \\EXTENSIBILITY, IMPLEMENTATION OF
.CENTER
^&4.4: ^HOW ^EXTENSIBILITY IS ^IMPLEMENTED.\&
.SKIP
.PARAGRAPH
^THE SYNTAX OF ^I^M^P72 IS STORED IN A SYNTAX GRAPH AND TWO ASSOCIATED CONNECTIVITY MATRICES, AS DESCRIBED IN (^IRONS 1971), EXCEPT THAT THE GRAPH IS NOT
BACK-OPTIMIZED, IN ORDER TO BE ABLE TO ADD NEW PRODUCTIONS WITHOUT GREAT FUSS.
^NEW PRODUCTIONS ARE ADDED TO THE GRAPH, AND THE MATRIX UPDATED, BY SUBROUTINE
^G^R^A^P^H, WHICH IS CALLED WITH ONE PRODUCTION.  ^THE PARSER ACCESSES THE GRAPH VIA
OTHER SUBROUTINES IN THE SYNTAX GRAPH MODULE.
.PARAGRAPH
^INITIALLY, THE GRAPH IS EMPTY.  ^SUBROUTINE ^R^S^Y^N HAS BUILT INTO IT A SYNTAX
AND SEMANTICS FOR VERY SIMPLE SYNTAX STATEMENTS.  ^THE PROCESS OF CREATING AN ^I^M^P
COMPILER BEGINS BY CALLING ^R^S^Y^N (FROM THE DRIVER PROGRAM ^I^M^P) TO READ A SIMILAR
SYNTAX AND SEMANTICS FROM FILE ^S^Y^N^T^A^X.  ^ONCE THIS IS DONE, THE COMPILER PRESENTS
AN ASTERISK, AND IS NORMALLY INSTRUCTED TO CONTINUE COMPILING FROM FILE ^S^Y^N^T^A^X.
(^SEE ^SECTION 3.4 FOR THE EXACT PROCEDURE.)  ^NOW, HOWEVER, THE COMPILER IS BOOTSTRAPPED, AND USES THE SYNTAX AND SEMANTICS IN ITS INTERNAL TABLES.  ^THE FIRST
STATEMENTS IT READS ARE THE SYNTAX AND SEMANTICS FOR MORE COMPLEX SYNTAX STATEMENTS.  ^AFTER THIS COMES THE SYNTAX FOR THE COMPUTATIONAL PORTION OF THE LANGUAGE.  ^WHEN THIS HAS BEEN COMPILED, THE COMPILER IS SAVED.  ^THUS, EXCEPT FOR
LEXICAL CONVENTIONS AND THE SYNTAX BUILT INTO ^R^S^Y^N (WHICH IS ONLY USED TO BOOTSTRAP THE COMPILER), THE ENTIRE SYNTAX AND SEMANTICS FOR ^I^M^P72 COMES FROM FILE
^S^Y^N^T^A^X AND THE SEMANTIC SUBROUTINES REFERRED TO ON IT.
.PARAGRAPH
^THE OTHER ROUTINES ON FILES ^R^S^Y^N AND ^R^S^Y^N2 IMPLEMENT THE SEMANTICS FOR SYNTAX STATEMENTS.  ^THEY WERE AT ONCE THE FIRST AND THE MOST COMPLEX SEMANTIC ROUTINES IMPLEMENTED, AND, TO PUT IT KINDLY, ARE RATHER OBSCURE.  ^THE ROUTINES
^S^Y^T^R^M, ^S^Y^N^T, AND ^S^Y^N^T^S BUILD UP A PRODUCTION IN ARRAY ^S^N WHICH IS THEN ENTERED
IN THE SYNTAX GRAPH BY SEMANTIC ROUTINE ^S^Y^N^T^A^X.  ^AT THIS POINT, A LIST OF THE
NAMES OF THE ARGUMENTS OF THE PRODUCTION IS IN ARRAY ^N^A FOR USE IN COMPILING
THE SEMANTICS.
.PARAGRAPH
^BASICALLY, SEMANTICS ARE COMPILED INTO ARRAY ^S^E^M^S IN THE SEMANTICS PACKAGE
VIA CALLS ON ^S^E^T^S^E^M.  ^SEMANTIC ROUTINE CALLS ARE COMPILED BY SEMANTIC ROUTINES
^S^E^M^P AND ^S^E^M^R, WHICH CHECK ^N^A TO SEE IF IDENTIFIERS ARE ARGUMENTS OF THE PRODUCTION.
.PARAGRAPH
^QUOTED SEMANTICS ARE PROCESSED BY SEMANTIC ROUTINE ^Q^U^O^S^E^M, WHICH CONVERTS
PARSER OUTPUT INTO SEMANTICS WHICH IT ENTERS IN THE SEMANTICS ARRAY VIA ^S^E^T^S^E^M.
.PARAGRAPH
^WHEN A SEMANTIC CONDITION IS ENCOUNTERED, SEMANTIC ROUTINE ^Q^U^O^S^E^M ENTERS THE
PATTERN IN THE CODE GENERATION TREE WITH A CALL TO ^E^N^T^R^E^E, WHICH RETURNS A LIST
OF THE FORMAL ARGUMENTS OF THE CONDITION.  ^Q^U^O^S^E^M THEN CALLS ^S^E^M^F^I^X (IN THE
SEMANTIC PACKAGE) TO PROCESS THE SEMANTICS, WHICH HAVE ALREADY BEEN ENTERED IN
THE SEMANTICS ARRAY, TO CONFORM WITH THE NEW LIST OF FORMAL ARGUMENTS.
.PARAGRAPH
^WHEN A MODIFIER FOR A ^V^A^L^U^E KLUDGE IS ENCOUNTERED ON QUOTED SEMANTICS,
SEMANTIC ROUTINE ^R^E^P^V^A^L PERFORMS THE NECESSARY ALTERATION ON THE PARSER OUTPUT
BEFORE ^Q^U^O^S^E^M GETS IT.
.PARAGRAPH
^SEMANTIC PACKAGE ROUTINE ^S^E^M^F^X1 IS CALLED TO PERFORM A SIMILAR ALTERATION ON
DEFAULT CASE SEMANTICS IN THE EVENT THAT A ^V^A^L^U^E KLUDGE APPLIES TO THEM.
.SUBTITLE 5: ^DISTRIBUTION ^PROCEDURE FOR ^I^M^P72.
.PAGE
.CENTER
^&5: ^DISTRIBUTION ^PROCEDURE FOR ^I^M^P72.\&
.PARAGRAPH
^UNTIL FURTHER NOTICE, PERSONS INTERESTED IN RECEIVING COPIES OF THE ^I^M^P72
COMPILER MAY FOLLOW THIS PROCEDURE:
.PARAGRAPH
^THE MASTER COPY OF THE COMPILER WILL BE MAINTAINED BY THE PERSON WHOSE NAME AND ADDRESS APPEAR BELOW.
^FROM TIME TO TIME, AS IMPROVEMENTS
ARE MADE AND BUGS ARE UNMADE, A NEW VERSION OF THE COMPILER WILL BE ISSUED,
CONTAINING ALL UPDATES AND CORRECTIONS KNOWN TO THAT POINT, AND COMPATIBLE WITH
PREVIOUS VERSIONS EXCEPT IN CASES OF EXTREME NECESSITY.
.PARAGRAPH
^A VERSION WILL BE RELEASED ON TWO ^D^E^CTAPES, CONTAINING THE FOLLOWING:
.LEFT MARGIN 10
.SKIP
.INDENT -3
1. ^FILES ^^IMP.LOW\\ AND ^^IMP.SHR\\: THE COMPILER.
.SKIP
.INDENT -3
2. ^A FILE ^I^M^P.^R^N^O: THE ^^RUNOFF\\ SOURCE FOR THIS MANUAL.
.SKIP
.INDENT -3
3. ^A FILE ^I^M^P^L^I^B.^L^I^B: THE ^I/^O LIBRARY FOR ^I^M^P72 PROGRAMS.
.SKIP
.INDENT -3
4. ^SOURCE FILES FOR THE COMPILER (WITH EXTENSION ^^IMC\\).
.SKIP
.INDENT -3
5. ^SOURCE FILES FOR THE ^I/^O LIBRARY (WITH EXTENSION ^I^M^L).
.SKIP
.INDENT -3
6. ^A FILE ^F^O^R^T^I^O.^M^A^C, WHICH CONTAINS UTILITY SUBROUTINES INCLUDED IN ^^IMPLIB.LIB\\.
 ^F^O^R^T^I^O.^H^L^P IS ALSO INCLUDED FOR THE CURIOUS.
.SKIP
.INDENT -3
7. ^A FILE ^R.^C^M^D WHICH CAN BE USED TO LOAD THE COMPILER VIA .^L^O^A^D @^R.
.LEFT MARGIN 0
.PARAGRAPH
^ANYONE WISHING TO OBTAIN A COPY OF THE LATEST RELEASE IS INVITED TO SEND
TWO ^D^E^CTAPES TO:
.NOFILL
.LEFT MARGIN 15
.SKIP
^^WALTER BILOFSKY
BOLT BERANEK AND NEWMAN, INC.
50 MOULTON STREET
CAMBRIDGE, MASS. 02138\\
.FILL
.LEFT MARGIN 0
.INDEX BUGS, REPORTING OF
.INDEX LOCAL VERSIONS OF ^I^M^P, SUGGESTIONS FOR MAKING
.PARAGRAPH
^WELL-DOCUMENTED INFORMATION CONCERNING SPECIFIC BUGS IN THE COMPILER, IF
COUCHED IN GENTLE AND SOOTHING TERMS, AND SUGGESTIONS, BRIEFLY EXPRESSED, WILL
ALSO BE RECEIVED CHEERILY AT THE ABOVE ADDRESS.  ^THERE IS NO GUARANTEE, HOWEVER,
THAT THE FANTASTIC IMPROVEMENTS YOU HAVE MADE IN ^Y^O^U^R ^I^M^P72 WILL BE INCLUDED IN
LATER RELEASES OF ^O^U^R ^I^M^P72.  ^THEREFORE, THOSE INTERESTED IN UTILIZING FUTURE
RELEASES WITH MINIMAL ANGUISH FACTOR ARE ADVISED TO CONFINE MODIFICATIONS WHEREVER POSSIBLE TO
.SKIP
.LEFT MARGIN 10
.INDENT -3
1. ^NEW SYNTAX, ON FILES TO BE COMPILED BY ^I^M^P72, OR, FAILING THAT,
.SKIP
.INDENT -3
2. ^NEW SEMANTIC SUBROUTINES ON SOURCE FILES SEPARATE FROM THE
ORIGINAL COMPILER SOURCE FILES.
.LEFT MARGIN 0
.PARAGRAPH
^NOTWITHSTANDING ANY OF THE ABOVE OR BELOW, NEITHER ^YALE ^UNIVERSITY, ITS
^DEPARTMENT OF ^COMPUTER ^SCIENCE, ITS GRADUATE STUDENTS, FACULTY OR EMPLOYEES, ^BOLT ^BERANEK AND ^NEWMAN, ^INC., THE
AUTHOR, THEIR IMMEDIATE FAMILIES, FRIENDS OR NEIGHBORS, ASSERT OR ASSUME ANY RESPONSIBILITY FOR THE ACCURACY OF THE MATERIAL CONTAINED HEREIN, FOR THE CONTINUED MAINTAINENCE, DEVELOPMENT, OR AVAILABILITY OF THE ^I^M^P72 COMPILER, OR FOR
ANY DIFFICULTIES RESULTING FROM ITS MIS-USE, -APPLICATION, OR -UNDERSTANDING, OR
FOR YOUR TWO ^D^E^CTAPES.
.PARAGRAPH
^CAVEAT ^USOR!  ^GOOD LUCK!
.SUBTITLE ^APPENDIX ^I. ^UTILITY ^LIBRARY ^SUBROUTINES.
.PAGE
.CENTER
^&^APPENDIX ^I. ^UTILITY ^LIBRARY ^SUBROUTINES.\&
.SKIP
.PARAGRAPH
^THE ^I^M^P RUN-TIME LIBRARY, FILE ^^IMPLIB.LIB\\, CONTAINS A
PACKAGE OF SUBROUTINES CALLED ^^FORTIO\\, ORIGINALLY PROGRAMMED BY
^KEN ^SHOEMAKE AT THE ^YALE ^DEPARTMENT OF ^COMPUTER ^SCIENCE TO
ENABLE ^^FORTRAN\\ PROGRAMMERS TO INTERFACE WITH
THE ^D^E^CSYSTEM-10 MONITOR FROM A HIGHER-LEVEL LANGUAGE.  ^THESE
ROUTINES ARE USEFUL TO ^I^M^P PROGRAMMERS WORKING UNDER ^D^E^CSYSTEM-10,
AND ARE THEREFORE DESCRIBED HERE.
.PARAGRAPH
^MANY OF THE FUNCTIONS PERFORM THE ^D^E^CSYSTEM-10 ^U^U^O'S OF THE
SAME NAME, AND MORE INFORMATION ABOUT THEM CAN BE FOUND IN THE
^D^E^CSYSTEM-10 ^ASSEMBLY ^LANGUAGE ^HANDBOOK.  ^IN THE LISTING BELOW,
OPTIONAL ARGUMENTS ARE ENCLOSED IN ANGLE BRACKETS.  ^UNLESS OTHERWISE
STATED, STRING ARGUMENTS TO THESE FUNCTIONS ARE ^^IMP ASCII\\ STRINGS.
.SKIP
.INDEX UTILITY SUBROUTINES
.LEFT MARGIN 10
.INDEX ^^SAVREG\\
.INDENT -10
^^SAVREG\\(ARRAY): SAVES ALL REGISTERS IN THE 16-LONG ARRAY ARRAY.
.SKIP
.INDEX ^^RSTREG\\
.INDENT -10
^^RSTREG\\(ARRAY): RESTORES ALL REGISTERS FROM THE 16-LONG ARRAY ARRAY.
.SKIP
.INDEX ^^ARGCNT\\
.INDENT -10
^^ARGCNT()\\: RETURNS THE NUMBER OF ARGUMENTS THE CALLING PROGRAM WAS
CALLED WITH; UNDEFINED  FOR A MAIN PROGRAM.
.SKIP
.INDEX ^^CALLI\\
.INDENT -10
^^CALLI\\(FN,<V1,V2>): PERFORMS THE ^^CALLI UUO\\.  ^FN IS EITHER
THE FUNCTION NAME OR THE CORRESPONDING OCTAL NUMBER.  ^V1, AND V2 IF
APPROPRIATE, ARE THE VALUES FOR ^A^C AND ^A^C+1.  ^^CALLI\\
RETURNS THE VALUE RETURNED IN THE ACCUMULATOR FROM THE ^U^U^O.
^N.^B.: ^WHERE FN IS A CONSTANT LESS THAN 4096 AND V1 BUT
NOT V2 IS PRESENT, THIS WILL COMPILE AS AN IN-LINE ^^CALLI\\ (SEE
^SECTION 2.2.9).
.SKIP
.INDEX ^^NOSKIP\\
.INDENT -10
^^NOSKIP()\\: RETURNS -1 IF THE LAST CALL TO THE ROUTINE ^^CALLI\\
RESULTED IN A NO-SKIP RETURN, 0 OTHERWISE.
.SKIP
.INDEX ^^SIXBIT\\
.INDENT -10
^^SIXBIT(\\STG): RETURNS THE ^^ASCII\\ STRING STG (SIX CHARACTERS OR
LESS) CONVERTED TO ^^SIXBIT\\.
.SKIP
.INDEX ^^ASCII\\
.INDENT -10
^^ASCII\\(SIXB): RETURNS THE SIXBIT WORD SIXB, CONVERTED TO ^^ASCII\\.
^THE SECOND WORD OF THE RESULT IS RETURNED IN REGISTER 1^R.
.SKIP
.INDEX ^^RAD50\\
.INDENT -10
^^RAD50(\\STG,<BITS>): RETURNS THE VALUE OF STRING STG AS RADIX 50,
WITH BITS IN THE FOUR CODE BITS.
.SKIP
.INDEX ^^RADX50\\
.INDENT -10
^^RADX50(\\SIXB,<BITS>): RETURNS THE VALUE OF THE SIXBIT WORD SIXB AS
RADIX 50, WITH BITS IN THE FOUR CODE BITS.
.SKIP
.INDEX  ^^ASCI50\\
.INDENT -10
^^ASCI50(\\R50,<BITS>): RETURNS THE VALUE OF THE RADIX 50 SYMBOL R50
CONVERTED TO ^^ASCII\\ (SECOND WORD IN REGISTER 1^R).  ^IF BITS IS
PRESENT, IT IS SET TO THE VALUE OF THE CODE BITS.
.SKIP
.INDEX ^^SIX50\\
.INDENT -10
^^SIX50(\\R50,<BITS>): RETURNS THE VALUE OF THE RADIX 50 SYMBOL R50
CONVERTED TO SIXBIT.  ^IF BITS IS PRESENT, IT IS SET TO THE VALUE
OF THE CODE BITS.
.SKIP
.INDEX ^^OPEN\\
.INDENT -10
^^OPEN(\\CH,ARY): PERFORMS THE ^^OPEN UUO\\
ON CHANNEL CH WITH THE ADDRESS OF THE THREE-WORD ARRAY ARY AS
THE EFFECTIVE ADDRESS.  ^RETURNS 0 IF NO ERROR, -1  OTHERWISE.
.SKIP
.INDEX ^^INIT\\
.INDENT -10
^^INIT\\(CH,STAT,<DEV,OBUF,IBUF>): PERFORMS THE ^^INIT\\ ^U^U^O WITH
THE SPECIFIED INFORMATION.  '^D^S^K' IS THE DEFAULT DEVICE,
AND IF OBUF OR IBUF CONTAINS A LEFT-JUSTIFIED ^^ASCII\\ '0' THE
CORRESPONDING BUFFER IS OMITTED IN THE CALL.
.SKIP
.INDEX ^^INBUF\\
.INDENT -10
^^INBUF(\\CHAN,N): PERFORMS THE ^^INBUF UUO\\ WITH THE SPECIFIED INFORMATION.
.SKIP
.INDEX ^^OUTBUF\\
.INDENT -10
^^OUTBUF\\(CHAN,N): PERFORMS THE ^^OUTBUF UUO\\ WITH THE SPECIFIED INFORMATION.
.SKIP
.INDEX ^^RENAME\\
.INDENT -10
^^RENAME(\\CHAN,ARY)
.INDENT -10
^^RENAME(\\CHAN,NAME,EXT,<PJ,PG>): PERFORMS THE ^^RENAME UUO\\
USING, IN THE FIRST FORM, THE ARGUMENT BLOCK IN THE ARRAY ARY, AND IN
THE SECOND FORM, THE ARGUMENTS SHOWN.  ^RETURNS 0 IF NO ERROR, 
OTHERWISE -1-(ERROR NR.).
.SKIP
.INDEX ^^LOOKUP\\
.INDENT -10
^^LOOKUP\\(CHAN,ARY)
.INDENT -10
^^LOOKUP\\(CHAN,NAME,EXT,<PJ,PG>): PERFORMS THE ^^LOOKUP\\ ^U^U^O;
SIMILAR TO ^^RENAME\\ Q.V.
.SKIP
.INDEX ^^ENTER\\
.INDENT -10
^^ENTER(\\CHAN,ARY)
.INDENT -10
^^ENTER(\\CHAN,NAME,EXT,<PJ,PG>): PERFORMS THE ^^ENTER\\ ^U^U^O;
SIMPLAR TO ^^RENAME\\ Q.V.
.SKIP
.INDEX ^^RELEA\\
.INDENT -10
^^RELEA\\(CHAN): RELEASES THE SPECIFIED CHANNEL.
.SKIP
.INDEX ^^CLOSE\\
.INDENT -10
^^CLOSE\\(CHAN,<N>): PERFORMS THE ^^CLOSE \\CHAN,N ^U^U^O.
.SKIP
.INDEX ^^INPUT\\
.INDEX ^^IN\\
.INDENT -10
^^IN(\\CHAN,<^L^O^C(ARRY)>)
.INDENT -10
^^INPUT\\(CHAN,<ARRY>): PERFORMS THE ^I^N ^U^U^O .  ^RETURNS -1 FOR
AN ERROR RETURN, 0 OTHERWISE.
.SKIP
.INDEX ^^OUT\\
.INDEX ^^OUTPUT\\
.INDENT -10
^^OUT\\(CHAN,<^L^O^C(ARRY)>)
.INDENT -10
^^OUTPUT(\\CHAN,<ARRY>): PERFORMS THE ^^OUT UUO\\.  ^RETURNS -1 FOR
AN ERROR RETURN, 0 OTHERWISE.
.SKIP
.INDEX ^^GETSTS\\
.INDENT -10
^^GETSTS\\(CHAN): RETURNS THE RESULT OF A ^^GETSTS\\ FOR THE 
SPECIFIED CHANNEL.
.SKIP
.INDEX ^^SETSTS\\
.INDENT -10
^^SETSTS(\\CHAN,STATUS): PERFORMS THE ^^SETSTS UUO\\ FOR THE SPECIFIED
CHANNEL AND STATUS WORD.
.SKIP
.INDEX ^^STATO\\
.INDENT -10
^^STATO\\(CHAN,BITS): RETURNS -1 IF A ^^STATO\\ FOR THE SPECIFIED
CHANNEL GAVE A SKIP RETURN, 0 OTHERWISE.
.SKIP
.INDEX ^^STATZ\\
.INDENT -10
^^STATZ(\\CHAN,BITS): RETURNS -1 IF A ^^STATZ\\ FOR THE SPECIFIED CHANNEL
GAVE A SKIP RETURN, 0 OTHERWISE.
.SKIP
.INDEX ^^GETCHA\\
.INDENT -10
^^GETCHA(): \\RETURNS THE NUMBER OF A CHANNEL WHICH IS NOT OPEN,
STARTING WITH CHANNEL 17^B.  ^IF NO CHANNELS ARE AVAILABLE,
RETURNS -1.
.SKIP
.INDEX ^^MTAPE\\
.INDENT -10
^^MTAPE\\(CHAN,N): PERFORMS THE INDICATED ^^MTAPE\\ FUNCTION.
.SKIP
.INDEX ^^UGETF\\
.INDENT -10
^^UGETF\\(CHAN): RETURNS THE RESULT OF A ^^UGETF UUO\\ ON THE
SPECIFIED CHANNEL.
.SKIP
.INDEX ^^USETI\\
.INDENT -10
^^USETI\\(CHAN,BLKNUM): PERFORMS THE ^^USETI UUO\\ FOR THE SPECIFIED
CHANNEL AND BLOCK.
.SKIP
.INDEX ^^USETO\\
.INDENT -10
^^USETO\\(CHAN,BLKNUM): PERFORMS THE ^^USETO UUO\\ FOR THE SPECIFIED
CHANNEL AND BLOCK.
.SKIP
.INDEX ^^INCHRW\\
.INDENT -10
^^INCHRW\\(): RETURNS THE VALUE OF A RIGHT-JUSTIFIED CHARACTER
FROM THE TELETYPE, WAITING UNTIL ONE IS TYPED.
.SKIP
.INDEX ^^OUTCHR\\
.INDENT -10
^^OUTCHAR\\(CHAR): TYPES THE SPECIFIED RIGHT-JUSTIFIED CHARACTER ON
THE TELETYPE.
.SKIP
.INDEX ^^INCHRS\\
.INDENT -10
^^INCHRS()\\: RETURNS A CHARACTER (RIGHT-JUSTIFIED) READ FROM
THE TELETYPE, OR -1 IF NONE HAS BEEN TYPED.
.SKIP
.INDEX ^^INCHWL\\
.INDENT -10
^^INCHWL\\(): RETURNS A CHARACTER (RIGHT-JUSTIFIED) READ
FROM THE TELETYPE, WAITING UNTIL A BREAK CHARACTER (E.G., CARRIAGE RETURN
OR ALTMODE) HAS BEEN TYPED.  ^THIS IS THE PREFERRED WAY TO READ FROM
THE TELETYPE AS IT ALLOWS THE PERSON TYPING TO EDIT HIS LINE USING
RUBOUT AND CONTROL-^U.
.SKIP
.INDEX ^^INCHSL\\
.INDENT -10
^^INCHSL\\(): SAME AS ^^INCHWL\\, BUT RETURNS -1 IF A LINE HAS NOT
BEEN TYPED.
.SKIP
.INDEX ^^RESCAN\\
.INDENT -10
^^RESCAN\\(BIT): BACKS UP THE TELETYPE SCAN PAST ONE BREAK CHARACTER,
IN ORDER TO ALLOW REREADING OF THE LAST LINE (POSSIBLY A COMMAND)
TYPED.  ^IF BIT IS 1, RETURNS -1 IF NO COMMAND IS IN THE
BUFFER.
.SKIP
.INDEX ^^SKPINC\\
.INDENT -10
^^SKPINC()\\: RETURNS -1 IF A CHARACTER HAS BEEN TYPED, 0 OTHERWISE.
.SKIP
.INDEX ^^SKPINL\\
.INDENT -10
^^SKPINL()\\: RETURNS -1 IF A LINE HAS BEEN TYPED, 0 OTHERWISE.
.SKIP
.INDEX ^^OUTSTR\\
.INDENT -10
^^OUTSTR(\\STRING): TYPES THE SPECIFIED ^^ASCII\\ STRING
ON THE TELETYPE.
.SKIP
.INDEX ^^IONEOU\\
.INDENT -10
^^IONEOU(\\CHAR): TYPES A SINGLE 8-BIT CHARACTER ON THE TELETYPE.
.SKIP
.INDEX ^^GETLCH\\
.INDENT -10
^^GETLCH\\(<LINE>): RETURNS THE LINE CHARACTERISTICS FOR
THE SPECIFIED LINE; ASSUMES THE CALLER'S LINE IF NONE IS SPECIFIED.
.SKIP
.INDEX ^^SETLCH\\
.INDENT -10
^^SETLCH\\(VALUE): SETS THE LINE CHARACTERISTICS FOR THE CALLER'S LINE.
.SKIP
.INDEX ^^CLRBFI\\
.INDENT -10
^^CLRBFI()\\: CLEARS THE INPUT BUFFER.
.SKIP
.INDEX ^^CLRBFO\\
.INDENT -10
^^CLRBFO()\\: CLEARS THE OUTPUT BUFFER.
.SUBTITLE ^APPENDIX ^I^I: ^SYNTAX OF ^^IMP72\\.
.PAGE
.CENTER
^&^APPENDIX ^I^I: ^SYNTAX OF ^^IMP\\72.\&
.RIGHT MARGIN 80
.LEFT MARGIN 0
.SKIP 2
.TAB STOPS 11
.NOFILL
.INDEX SYNTAX OF ^^IMP\\
^^
<NAM>	::= NAM"
<SYM>	::= SYM"
<SPT>	::= <SPT,A> <SYM,B>   
<SPT>	::= <SPT,A> '<' <NAM,B>,<NAM,C> > 
<SMA>	::= <NAM,A> ( )               
<SMA>	::= <SPN,A> ( <SPL,B> )       
<SPN>	::= <NAM,A>                   
<SPL>	::= <SPI,A>
<SPL>	::= <SPL,A> , <SPI,B>
<SPI>	::= <NAM,A>                   
<CSM>	::= <SMA,A>                   
<SMP>	::= <CSM,A>
<ST>	::= <SPT,A>                   
<SAU>	::= =                         
<ST>	::= <SPT,A>':' ':'<SAU,C><SMP,B>
<STL>	::= <ST,A>
<STL>	::= <STL,A> ';' <ST,B>        
<PG>	::= <STL,A> '%'               
<SPI>	::= <SPI,A> + <SPI,B>                 
<SPT>	::= <SPT,A> '<' <NAM,B> >             
<SPT>	::= '<'<NAM,A>>':' ':'='<'<NAM,B>> 
<SSP>	::= VALUE <NAM,A> OF <NAM,B>          
<SSP>	::= PRIORITY <NAM,A> <SMA,B>          
<SSP>	::= PRIORITY <NAM,A> <SSP,B>          
<ST>	::= <SPT,A>':' ':'<SAU,B><SSP,C>       
<SMP>	::= <SMP,A> ELSE <CSM,C>
<CSM>	::= CASE (<NLIST,A>) OF <NAM,B>               
<CSM>	::= CASE (<NLIST,A>) OF <CASENAM,B> (<SMP,C>) 
<CASENAM>	::= <NAM,A>                                   
<SQUOTE>	::= "                    
<QUOSEM>	::= <SQUOTE,A> <STL,B> " 
<QUOSEM>	::= <NAM,A> / <QUOSEM,B>                      
<CSM>	::= <QUOSEM,A> => <SMA,B>                     
<CSM>	::= <QUODEF,A>                                
<CSM>	::= <QUOSEM,A> => <QUODEF,B>                  
<QUODEF>	::= <QUOSEM,A>                                
<QUODEF>	::= LOCAL <NLIST,A> IN <QUOSEM,B>             
<VBL>	::= <NAM,A> 
<ION>	::= <VBL,A>
<ATOM>	::= <ION,A>
<EXP>	::= <ATOM,A>
<ST>	::= <EXP,A>
<ION>	::= (<STL,A>)
<ST>	::= GO TO <EXP,A>      
<ST>	::= <NAM,A> ':' <ST,B> 
<ION>	::= <NAM,A> ( )     
<ION>	::= <NAM,A> ( <ELIST,B> )
<ST>	::= <NLIST,A> IS  <PLIST,B> 
<ST>	::= <NLIST,A> ARE <PLIST,B> 
<NLIST>	::= <NAM,A>                 
<NLIST>	::= <NLIST,A> , <NAM,B>     
<PLIST>	::= <PROP,A>
<PLIST>	::= <PLIST,A> , <PROP,B>
<PROP>	::= <NAM,A>            
<PROP>	::= <EXP,A> LONG       
<PROP>	::= COMMON             
<PROP>	::= REAL               
<PROP>	::= INTEGER            
<PROP>	::= REGISTER           
<PROP>	::= RESERVED           
<PROP>	::= SCRATCH            
<PROP>	::= PROTECTED          
<PROP>	::= AVAILABLE          
<PROP>	::= RELEASED           
<PROP>	::= LOCAL              
<SYN>	::= LET 
<SYN>	::= <SYN,A> <NAM,B>=<VBL,C>, 
<ST>	::= <SYN,A> <NAM,B>=<VBL,C> 
<ATOM>	::= - <ATOM,A>    
<ATOM>	::= NOT <ATOM,A>  
<EXP>	::= <ATOM,I>   LS <EXP,J> 
<EXP>	::= <ATOM,A>  ALS <EXP,B> 
<EXP>	::= <ATOM,A> LROT <EXP,B> 
<EXP>	::= <ATOM,A>   RS <EXP,B> 
<EXP>	::= <ATOM,A>  ARS <EXP,B> 
<EXP>	::= <ATOM,A> RROT <EXP,B> 
<EXP>	::= <ATOM,Y> * <EXP,Z> 
<EXP>	::= <ATOM,A> + <EXP,B> 
<EXP>	::= <ATOM,X> - <EXP,Y> 
<EXP>	::= <ATOM,A> / <EXP,B> 
<EXP>	::= <A>//<B>
<EXP>	::= <ATOM,X> AND <EXP,Y>
<EXP>	::= <ATOM,A>  OR <EXP,B> 
<EXP>	::= <ATOM,A> XOR <EXP,B> 
<EXP>	::= <ATOM,A> EQV <EXP,B> 
<EXP>	::= <VBL,A> __ <EXP,B> 
<EXP>	::= <VBL,A> '<'= <EXP,B> 
<VBL>	::= <VBL,A> [<EXP,B>] 
<VBL>	::= [<EXP,A>]         
<ST>	::= SUBR <SUBP,A> IS <EXP,B> 
<SUBP>	::= <NAM,A> ( <NLIST,B> )    
<SUBP>	::= <NAM,A> ( )              
<ST>	::= RETURN <A>               
<ST>	::= GO TO ( <GOLST,A> ) <B>  
<GOLST>	::= <NAM,A>                  
<GOLST>	::= <GOLST,A> , <NAM,B>      
<ELIST>	::= <EXP,A>                  
<ELIST>	::= <ELIST,A>,<B>            
<ST>	::= DATA ( <ELIST,A> )       
<ST>	::= REMOTE <ST,A>            
<ATOM>	::= LOC ( <VBL,A> )          
<RELOP>	::= =  
<RELOP>	::= '<' 
<RELOP>	::= >  
<RELOP>	::= NE  
<RELOP>	::= LE  
<RELOP>	::= GE  
<RELOP>	::= EQ  
<RELOP>	::= LT  
<RELOP>	::= GT  
<ST>	::= <EXP,A> => <ST,B>
<ST>	::= <EXP,A> <RELOP,EQ> <EXP,B>
<ST>	::= <EXP,A> <RELOP,EQ> <EXP,B> => <ST,C> 
<ST>	::= <EXP,A> <RELOP,EQ> <EXP,B> => <ST,C> ELSE <ST,D> 
<ST>	::= <EXP,A> <RELOP,EQ> <EXP,C> 
<ST>	::= MOVE <B> THROUGH <N> TO <A> 
<ST>	::= <EXP,A> FOR <VBL,B> IN <EXP,C>,<EXP,D>,<EXP,E> 
<ST>	::= <EXP,A> FOR <VBL,B> TO <EXP,C>   
<ST>	::= <EXP,A> FOR <VBL,B> FROM <EXP,C> 
<ST>	::= WHILE <EXP,A> DO <ST,B> 
<ST>	::= WHILE <EXP,A><RELOP,EQ><EXP,B> DO <ST,C> 
<ST>	::= <EXP,A> UNTIL <B><RELOP,EQ><C> 
<ST>	::= <EXP,A> UNTIL <EXP,B> 
<COND>	::= (<A> <RELOP,EQ> <B>) 
<COND>	::= (<A> <RELOP,EQ> <B>) OR <COND,C> 
<COND>	::= (<A> <RELOP,EQ> <B>) AND <COND,C> 
<ST>	::= <COND,A> => <ST,B> 
<ST>	::= <COND,A> => <ST,B> ELSE <ST,C> 
<ST>	::= WHILE <COND,A> DO <ST,B> 
<ST>	::= <EXP,A> UNTIL <COND,B> 
<IO>	::= PRINT <PITEM,A>    
<IO>	::= READ  <PITEM,A>    
<IO>	::= <IO,A> , <PITEM,B> 
<EXP>	::= <IO,A>             
<PITEM>	::= <EXP,A>                      
<PITEM>	::= OCT <A>                      
<PITEM>	::= IGR <A>                      
<PITEM>	::= STG <A>                      
<PITEM>	::= FILE <NAM,A>                     
<PITEM>	::= FILE <NAM,A>.<B>                 
<PITEM>	::= FILE <NAM,A>[<C>,<D>]            
<PITEM>	::= FILE <NAM,A>.<B>[<C>,<D>]        
<PITEM>	::= /                            
<PITEM>	::= DEVICE <A>    
<PITEM>	::= IMAGE MODE     
<PITEM>	::= TAB <N>     
<PITEM>	::= FILL <N>                     
<PITEM>	::= FLT <A>.<B>                  
<VBL>	::= <NAM,A>.<NAM,B> 
<VBL>	::= <NAM,A>.<NAM,B>"<ATOM,C> 
<ATOM>	::= FIX(<A>) 
<ATOM>	::= FLT(<A>) 
<BYTE>	::= <VBL,A> '<' <B> , <C> > 
<ATOM>	::= <ION,A> '<' <B> , <C> > 
<EXP>	::= <BYTE,A> __ <B>          
<ATOM>	::= BYTEP <BYTE,A>
<BYTE>	::= '<' <EXP,A> >
<ATOM>	::= '<' <EXP,A> >           
<ATOM>	::= '<' + <VBL,A> >         
<EXP>	::= '<' + <VBL,A> > __ <B>   
<ATOM>	::= <ION,A> '<' R >         
<ATOM>	::= <ION,A> '<' L >         
<EXP>	::= <VBL,A> '<' R > __ <B>   
<EXP>	::= <VBL,A> '<' L > __ <B>   
<ST>	::= EXECUTE <A> 
<ST>	::= CALL ME <NAM,A> 
<ST>	::= TWOSEG 
<ATOM>	::= IDPB(<A>,<B>) 
<ATOM>	::= ILDB(<A>)  
<ATOM>	::= R<VBL,A> 
<ION>	::= CALLI(<A>,<B>) 
<ATOM>	::= XWD <A>,<B> 
<ATOM>	::= IOWD <A>,<B> 
\\
.SUBTITLE ^REFERENCES
.RIGHT MARGIN 60
.PAGE
.CENTER
^&^REFERENCES\&
.LEFT MARGIN 0
.FILL
.LEFT MARGIN 8
.SKIP
.INDENT -7
^BILOFSKY 1972: ^I^M^P ^REFERENCE ^MANUAL, ^WORKING ^PAPER ^NO. 349, ^INSTITUTE FOR
^DEFENSE ^ANALYSES, ^PRINCETON, ^N.^J.
.SKIP
.INDENT -7
^BILOFSKY 1973: ^SYNTAX ^EXTENSION AND THE ^I^M^P ^PROGRAMMING
^LANGUAGE, UNPUBLISHED.
.SKIP
.INDENT -7
^EMERSON 1849: ^REPRESENTATIVE ^MEN.
.SKIP
.INDENT -7
^IRONS 1963: ^AN ^ERROR-^CORRECTING ^PARSE ^ALGORITHM, ^COMM. OF THE ^A^C^M, ^VOL. 6
^NO. 12, ^DEC. 1963
.SKIP
.INDENT -7
^IRONS 1970: ^EXPERIENCE WITH AN ^EXTENSIBLE ^LANGUAGE, ^COMM. OF THE ^A^C^M, ^VOL. 13
^NO. 1, ^JAN. 1970
.SKIP
.INDENT -7
^IRONS 1971: ^SYNTAX ^GRAPHS AND ^FAST ^CONTEXT ^FREE ^PARSING, ^RESEARCH ^REPORT
^NO. 71-1, ^DEPARTMENT OF ^COMPUTER ^SCIENCE, ^YALE ^UNIVERSITY.
.SKIP
.INDENT -7
^NAUR 1963: ^REVISED ^REPORT ON THE ^ALGORITHMIC ^LANGUAGE ^A^L^G^O^L 60.  ^COMM. OF THE
^A^C^M, ^VOL. 6 ^NO. 1, ^JAN. 1963.  ^SECTION 1.1 DEFINES ^B^N^F.
.SKIP
.INDENT -7
^SHAKESPEARE 1612: ^THE ^TEMPEST
.SKIP
.INDENT -7
^WEBSTER'S 1967: ^WEBSTER'S 7TH ^NEW ^COLLEGIATE ^DICTIONARY, 
^G_&^C ^MERRIAM ^CO., ^PUB., 1967.
.SKIP
.INDENT -7
^WEINGART 1973: ^AN ^EFFICIENT AND ^SYSTEMATIC ^METHOD OF ^CODE
^GENERATION, ^PH.^D. ^THESIS, ^DEPARTMENT OF ^COMPUTER ^SCIENCE,
^YALE ^UNIVERSITY, ^JUNE 1973.
.SUBTITLE ^INDEX
.PAGE
.LEFT MARGIN 0
.CENTER
^&^I^N^D^E^X\&
.SKIP
.PRINT INDEX