Contact us Heritage collections Image license terms
HOME ACL Associates Technology Literature Applications Society Software revisited
Further reading □ Overview □ Main papers □ ManualIntroductionIR MacCallum (thesis)RosenTrees/Routines □ Implementation □ Listing: OverviewSection 1Section 2Section 3Section 4IndexFlow diagramsSyntax analysis in compilers □ CC and Autocodes □ AutocodesMercury Autocode (MA) facilitiesMA in CCTwo-level storageAtlas Autocode (AA) featuresCC in AAIndex-directed □ Other papers □ Compiler SystemAssemblerRealisationTranslation programExperience with CCCC re-examinedThird-order compilerUseful subsetsLavingtonCoulourisReview of Rohl book □ CC on Bendix G21 □ G21 manualG21 flow diagrams □ Translator Writing Systems (TWS) □ Early TWSMetcalfe paperComputer Assoc. Inc paper
ACD C&A INF CCD CISD Archives Contact us Heritage archives Image license terms

Search

   
ACLApplicationsCompiler Compiler
ACLApplicationsCompiler Compiler
ACL ACD C&A INF CCD CISD Archives
Further reading

Overview
Main papers
ManualIntroductionIR MacCallum (thesis)RosenTrees/Routines
Implementation
Listing: OverviewSection 1Section 2Section 3Section 4IndexFlow diagramsSyntax analysis in compilers
CC and Autocodes
AutocodesMercury Autocode (MA) facilitiesMA in CCTwo-level storageAtlas Autocode (AA) featuresCC in AAIndex-directed
Other papers
Compiler SystemAssemblerRealisationTranslation programExperience with CCCC re-examinedThird-order compilerUseful subsetsLavingtonCoulourisReview of Rohl book
CC on Bendix G21
G21 manualG21 flow diagrams
Translator Writing Systems (TWS)
Early TWSMetcalfe paperComputer Assoc. Inc paper

ATLAS COMPILER COMPILER LISTING (22 December 1963)

Iain MacCallum, Dik Leatherdale

September 2014

This document explains the contents of a red spring-back binder, which contains a listing of the bootstrap loader of the Compiler Compiler printed on 22 December 1963. It was printed the day before Iain MacCallum left Ferranti/ICT for the Central Electricity Generating Board (CEGB). He had been working on the Compiler Compiler for his MSc and on an Algol 60 compiler with John Clegg, under the direction of Dr Robin Kerr, for Ferranti/ICT. No Algol 60 definitions appear to have survived, perhaps because the first attempt at the compiler was much larger than had been hoped for, a consequence of the single-rooted structure of its syntax. It caused an unacceptable amount of drum swapping. The red binder was retained by Iain while he was at the CEGB and subsequently throughout his time at the Department of Computer Science, University of Essex. On retiring from the University in 2001, he passed the binder to Simon Lavington who took care of it. In October 2013, Simon asked Iain if he recognised its contents! It was the date on the listing of various test runs at the end that confirmed the authenticity of the document: it was printed on Iain's last two days with Ferranti/ICT!

By an astonishing coincidence, a second copy of the listing was preserved in the Department (now School) of Computer Science at Manchester University. It was probably gathered by Derrick Morris and then passed to Dr Brian Napper, who took it upon himself to assemble a large box of material relating to the Compiler Compiler where it remained in the School's archive after Dr Napper's death. In mid 2013 it was borrowed by Dik Leatherdale by kind permission of Prof Jim Miles, the current head of the School. The contents of the box included a card bearing the warning THIS BOX INCLUDES PRICELESS ARCHIVE MATERIAL. DO NOT TOUCH WITHOUT Dr. R.B.E.NAPPER'S PERMISSION. It is thought that this second copy is a carbon copy of Iain MacCallum's as it is identical down to the page breaks which, in a few cases, run through the text of some lines. The box also contained the surviving copy of Jeff Rohl's flowcharts and notes on the Compiler Compiler as well as various listings which appear to relate to an attempt to transfer the Compiler Compiler to the Cambridge Atlas II (aka Titan). It is known that CC was used to create and support the Systems Assembly Language (SAL) at Cambridge [see ref. 1].

The document in the red binder (and the carbon copy) presented a challenge to Iain MacCallum, one of the original CC implementors, and Dik Leatherdale, author of an Atlas 1 Emulator [see ref. 3]: could they be scanned and used to reconstruct the Compiler Compiler on an emulator, running on a PC? By December 2013, Iain and Dik had managed to scan and load the entire bootstrap into the emulator, thus verifying the accuracy of all but a few routines at the end of the scan. There followed an extensive investigation by Dik and Bill Purvis (author of another Atlas 1 emulator) of the meaning of DEFINE COMPILER, and its relationship with the early version of the operating system of 1963. This was essential if the reconstructed CC was ever to compile a compiler! In May 2014 Dik and Bill cracked this and managed to define a trivial "language", write a trivial program in it, and execute it correctly on the two different emulators. Certain changes were made to adapt the program to the later, mature operating system definition supported by the emulators. This was essential if the reconstructed CC was ever to compile a compiler! In May 2014 they managed to define a trivial program written in the CC language and execute it correctly on the two different emulators.

The scan, with line numbers and contemporary comments, is referred to in this document as cc source_1.pdf. It is available here as Section 1, Section 2 and Section 3.

Structure of the listings

The listings in the red binder have been split into four sections, by content. The original input was, of course paper tape which has not survived. However, the CC Index (attached) refers to paper tapes B, C, D, E, F, G and H. It should, therefore be possible to identify these tapes on the listings. Sections 1 to 3 are the Compiler Compiler itself, and section 4 are listings of various test runs.

Section 1

Section 1 consists of 30 foolscap pages of Atlas Octal Input, containing up to 75 lines per page, numbered by hand from 1 to 30. These pages were produced by a cross assembler for Atlas running on the Mercury. The original input to this cross assembler has not been found. These pages in the binder were printed from 5-hole paper tape on a Creed Teleprinter. It took a sensitive OCR scanner (Omnipage 18) and many hours of human intervention to retrieve the code from this listing. This section is read by the Octal Input routine in the Atlas Fixed Store.

From a brief glance at Section 2, which is effectively the data for the program formed in Section 1, it is easy to mistake Section 1 for a conventional assembler of Atlas Intermediate Code. However, with reference to the list of contents of this section in Appendix 1, it can be seen that it is better described as a basic Compiler Compiler Kernel. It starts with the index and the main chain store both of which are used throughout all phases of the Compiler Compiler. It has simplified versions of fundamental routines such as the recursive routine entry code (DOWN) and exit code (END), the top-level MASTER routine, the syntactic ANALYSIS ROUTINE and the LINE RECONSTRUCTION Routine. As the ITEM routine assembles items in Section 2, it maintains the ITEM index.

Section 2

Consists of 107 foolscap pages of Atlas (CC) Intermediate Code (pages 2-1 to 2-107 - lines 2154 to 7954) printed on a Flexowriter, from 7-hole paper tape. These are Phrase Definitions, Format Dictionaries and more Routines. This section scanned reasonably well, the foolscap page size being the main drawback. Many pages had to be scanned twice and stitched together.

A list of the items of Section 2 is provided in Appendix 2. The objective of Section 2 is to develop a minimal compiler that will read the Phases, Formats and Routines of Section 3 in the full Compiler Compiler Language. It introduces a DELETE ITEM routine (ITEM 145), a REPLACE ITEM routine (ITEM 164) which is used to replace basic versions of, amongst others, the ANALYSIS Routine (ITEM 215), the LINE RECONSTRUCTION Routine (ITEM 238) and the MASTER Routine (ITEM 214). This version of the ANALYSIS Routine has to parse the relatively high level language statements seen in the listings of Section 3. The replacement LINE RECONSTRUCTION Routine admits multiple overstrikes to represent characters such as ≠ and ≥.

The three major routines of the Compiler Compiler that process the high level elements of the definition of a compiler are in this section: the PHRASE routine (ITEM 218), the FORMAT routine (ITEM 220) and the ROUTINE routine (ITEM 221). The hard work of processing the individual statements of a routine is done in ITEM 253, simply called "compile body of a routine."

Towards the end of this section are a number of hand-coded built-in routines for frequently used statements in the routines that define the semantics of the target language. As an example, four of these used for basic arithmetic on numbers and addresses are:

ITEM 187		[AB] = [WORD] [SEP]
ITEM 188		[AB] = [WORD][OPERATOR][WORD] [SEP]
ITEM 189		([ADDR]) = [WORD] [SEP]
ITEM 190		([ADDR]) = [WORD][OPERATOR][WORD] [SEP]

These are re-entered in the CC language in Section 3 with the same item numbers:

FORMAT [BS]	=[AB] = [WORD][SEP], 187
FORMAT [BS]	=[AB] = [WORD][OPERATOR][WORD][SEP], 188
FORMAT [BS]	=([ADDR]) = [WORD][SEP], 189
FORMAT [BS]	=([ADDR]) = [WORD][OPERATOR][WORD][SEP], 190

and

ROUTINE (COMPILER)[BS] ≡ [AB/1] = [WORD][SEP]
...
ROUTINE (COMPILER)[BS] ≡ [AB] = [WORD/1][OPERATOR][WORD/2][SEP]
...
ROUTINE (COMPILER)[BS] ≡ ([ADDR]) = [WORD][SEP]
...
ROUTINE (COMPILER)[BS] ≡ ([ADDR]) = [WORD/1][OPERATOR][WORD/2][SEP]
...

For an explanation of the qualifier (COMPILER) see Section 3 below.

The handling of LISTS, NESTS (stacks) and other relatively addressed data structures is by Auxiliary Statements [AS] such as ADD WORD TO LIST and ADD WORD TO NEST. These are hand-coded in this section, and like the built-in statements, are replaced in Section 3 by equivalent procedures written in the language of the Compiler Compiler.

Section 3

Pages 3-01 to 3-75 (lines 7958 to 10961) consists of 75 foolscap pages of PHRASE definitions, Built-in statements [BS], Auxiliary Statements [AS] and Routines, all in the language of the Compiler Compiler. See Appendix 3 for a list of all items in this Section.

This Section of the listing begins with a BNF-like definition of the syntax of the basic PHRASEs of the Compiler Compiler language. It is followed by the FORMATs of the Built-in Statements [BS], seven new Master Phrases [MP], and the Auxiliary Statements [AS], and finally the COMPILER versions of the Built-in Statements.

These pages were well printed and at first appeared to scan well. Like pages in the previous section, some needed to be "stitched". However, there were other problems in making digital sense of this section. The character set included the Greek letters α and β and the full range of comparator operators ≠ ≡ ≢ ≤ and ≥. The OCR scanner made numerous mistakes with brackets and other non-alphanumeric characters.

What is the purpose of the so-called COMPILER routines? For example, on page 3-03 at line 8050, is the definition of the Auxiliary Statement for adding a WORD to a LIST or a NEST.

ROUTINE [AS] ≡ ADD [WORD] TO [LIST OR NEST][AB][SEP]
		β69 = [AB]
		β68 = [WORD]
		α1 = CATEGORY OF [LIST OR NEST]
		α1 = α 1 + 203
		CALL R α1
		[AB] = β69
		END

Then on page 3-09 is the COMPILER version.

ROUTINE (COMPILER)[AS] ≡ ADD [WORD] TO [LIST OR NEST][AB][SEP]
		CALL [BS] COMPILER B69 = [AB]
		CALL [BS] COMPILER B68 = [WORD]
		A1 = CATEGORY OF [LIST OR NEST]
		A1 = A1 + 203
		PLANT 1102, 70, 76, A1 IN B88
		CALL [BS] COMPILER [AB] = B69
		END

When the routine at page 3-03 line 8050 is input, the 6 statements are analysed line by line, and assembled as analysis records for subsequent interpretation when it is called. Interpretation is slow. When the COMPILER version is input, the 6 statements are similarly analysed line by line but in this case native Atlas instructions are planted. When this version is executed it is fast!!

It is worth examining the COMPILER version at page 3-09 line 8830.

  1. The first statement
    CALL [BS] COMPILER B69 = [AB]
    
    needs a COMPILER version for the statement
    B69 = [AB]
    
    This is the second routine starting at line 8061 on page 3-03 running to page 3-05 line 8168, namely
    ROUTINE (COMPILER) [BS] ≡ [AB/1] = [WORD][SEP]
    
    So the first statement is compiled as native Atlas code.
  2. The second statement is compiled into native code in exactly the same way.
  3. The third and fourth statements
    A1 = CATEGORY OF [LIST OR NEST]
    A1 = A1 + 203
    
    trade on the juxtaposition of Items 204 and 205 in the index.
    	ITEM 204		Add word to list
    	ITEM 205		Add word to nest
    
    and the PHRASE definition
    PHRASE [LIST OR NEST] = LIST, NEST
    
    on page 3-01 at line 7976. LIST is Category 1 of [LIST OR NEST] and NEST is Category 2. Thus, they compute in variable A1, the appropriate item number, but plant nothing
  4. The next instruction does the planting of native code.
    PLANT 1102, 70, 76, A1 IN B88
    
  5. Finally,
    CALL [BS] COMPILER [AB] = B69
    
    calls the COMPILER version of [AB/1] = [WORD] used to plant code to update the address of the LIST OR NEST [AB].

Section 4 - Various outputs from loading Sections 1 to 3.

The final section, on continuous perforated line printer paper, with the sprocket holes removed, consists of the listing of six runs of the Compiler Compiler. These are best identified by the date and time of printing.

22.12.63     11.11.23

This is a Catastrophic Fault listing of the non-zero B-lines and the stack. The error was in R142, the pre editing routine. The circumstances and the reason have not been ascertained.

We found that the next two execution listings were essential to the loading of the reconstructed Compiler Compiler on the Atlas I emulators. As each batch of Optically scanned pages was added to the reconstructed input file, it was possible to check the output of the emulator with the output of 22 December 1963. Each discrepancy was investigated until an error in the source was located and corrected.

22.12.63     11.20.47

This is another Catastrophic Fault listing of the non-zero B-lines and the stack. Again the error was in R142, the pre editing routine. The circumstances and the reason have not been ascertained.

The next two execution listings were essential to the loading of the reconstructed Compiler Compiler on the Atlas I emulators. As each batch of Optically scanned pages was added to the reconstructed input file, it was possible to check the output of the emulator with the output of 22 December 1963. Each discrepancy was investigated until an error in the source was located and corrected.

22.12.63     11.41.42

This is the output from the CC as it loaded Parts 1, 2 and part 3 as far a page 3-35 (Tape G)

22.12.63      13.11.05

This is the output from the CC as it loaded Part 3 pages 3-36 to the end. (Tape H)

23.12.63      10.45.12

This appears to be the result of DEFINE COMPILER CC followed by a list of the B-lines.

23.12.63      10.45.51

This appears to be the result of DEFINE COMPILER CC2 followed by a list of the B-lines.

Philosophy of the Compiler Compiler bootstrap

The Compiler Compiler is "complete" in the sense that it may be written in its own language. In other words, it consists of phrase definitions, format dictionaries, and routines whose instructions belong to an extended set of the built-in instructions and auxiliary statements. The general implication of this is that once the material for interpreting one of these primary statements has been loaded, it is possible to process subsequent statements of that type written in the system language. This type of bootstrapping procedure has been adopted for the Compiler Compiler for three reasons.

  1. It has been possible to write a considerable part of the system in a language which is particularly suited to its own requirements and which reduces the likelihood of errors in the coding.
  2. It provides more positive evidence that the various parts of the system function properly; for example, if a phrase which has been processed by the phrase assembly routine is subsequently used by other parts of the program and is found to give the expected results then it is almost certain that the phrase has been assembled correctly.
  3. Once the Compiler Compiler is working on Atlas, it will be possible to produce a compiler for another computer by providing the Atlas version with a set of primary assembly routines which will plant machine instructions for the other computer. By reading the compiler again, written entirely in the language of the system, a compiler for the other machine will be generated.

The Phrase Definitions, Format Dictionaries and Routines in Section 2 of the listings are hard to decipher without the help of the index of item numbers/ descriptions. See the file CCINDEX.docx or CCINDEX.PDF.

Addressing Philosophy

The fundamental addressing unit on Atlas was the 48-bit word; used to contain an instruction or, more significantly, a floating-point number. The top 21 bits of the (24-bit) address were used to specify a word. But the word could also be divided into two 24-bit halfwords and eight 6-bit characters. To address these smaller quantities, the remaining 3 bits of the address were used. In normal Atlas parlance, an address might be specified as a decimal number with an optional octal "fraction". Thus the least significant halfword of word 91 would be specified as 91.4, and the least significant character of the same as 91.7.

But Compiler Compiler made little or no use of floating point numbers, dealing almost exclusively with halfwords. So, by contrast its addressing was specified in terms of halfwords with a decimal number in the source code mapping onto the top 22 bits of the address and the character addresses being specified as a 2-bit binary fraction. Thus in CC, the same addresses would be specified as 183 and 183.11.

The emulator displays information in "normal" Atlas addressing mode and whereas the Compiler Compiler itself finds no difficulty in employing its unusual addressing convention, it can be confusing for the human reader.

Relative Addressing

Once the decision had been taken to allow basic routines to be replaced by routines with more functionality, or which plant native code, it followed that all store references had to be relative. The rich instruction format of Atlas made this possible. Local variables are addressed relative to the start of the routine and jumps are all relative to the address of the jump instruction. Routine replacement consisted of adding the replacement routine - possibly using the original to do so with interrupts inhibited - sliding up memory over the original routine, updating indexes restoring interrupts and continuing reading routines.

However, certain routines, for example 0 (the compiler entry point), 281 (slide compiler up a block) , 279 (sub-routine entry - DOWN) cannot be allowed to move in memory and are designated as FIXED ITEMs.

Acknowledgements

During much of his two and a half years at Manchester University Iain sat at a desk in the drawing office of the Dover Street Building next to Jeff Rohl. Iain will never forget the diligence with which Jeff documented the Compiler Compiler in the form of hand-written flowcharts. Fortunately these gems found their way into the big box that Brian Napper guarded, and then to Dik who scanned them. Thus we had photo copies to refer to as we battled with the less than perfect OCR output. In the 1960s, computer memory was too precious to have it cluttered with comments! So we record our grateful thanks posthumously to Jeff and Brian!

Iain is also grateful to Tony Brooker who took him into the Compiler Compiler team in 1961, and to Derreck Morris who, in Tony's absence in the USA, led the CC development and supervised his MSc.

We are also indebted to Bill Purvis who provided the OCR scan of the Index that will help serious readers winkle out more detail from the bootstrap listings.

References

  1. Tony Brooker and the Atlas Compiler Compiler: http://curation.cs.manchester.ac.uk/atlas/elearn.cs.man.ac.uk/_atlas/docs/Tony%20Brooker%20and%20the%20Atlas%20Compiler%20Compiler.pdf
  2. The definitive description of the Compiler Compiler is this paper: R.A. Brooker, I.R.MacCallum, D. Morris, J.S. Rohl. "The Compiler Compiler", Annual Review in Automatic Programming, Vol.3, 229-71, Pergamon Press, 1963. Also available at: http://curation.cs.manchester.ac.uk/atlas/elearn.cs.man.ac.uk/_atlas/docs/Compiler%20Compiler%20Paper%201963%20Annual%20Review%20of%20Auto%20Prog.pdf
  3. Dik Leatherdale's emulator: http://www.cs.man.ac.uk/CCS/res/res65.htm#e
  4. IR MacCallum, MSc Thesis "Some aspects of the Implementation of the Compiler Compiler". Manchester University Thesis No. 7476. Available as a scanned copy at http://www.chilton-computing.org.uk/acl/pdfs/IainsMscThesis.pdf

Appendix 1

A list of all the items in Section 1 of the listings in the Red Binder in the order in which they appear.

Octal addresses of the first word Item
20001010 to 20002050 index (Items 130 to 266)
20002260 to 20007634 Chain
20016360 ITEM 239 DOWN
20017100 ITEM 240 END sequence
20017220 ITEM 215 ANALYSIS ROUTINE
20022540 ITEM 266 ITEM ROUTINE
20026670 ITEM 252 split chain into 2 subchains
20027060 ITEM 130 [MP] = PHRASE, ITEM, END OF MESSAGE, FORMAT, FORMAT CLASS, DELETE ITEM, REPLACE ITEM
20027460 ITEM 261 Convert metasyntactical symbols
20030560 ITEM 238 LINE RECONSTRUCTION routine
20032460 ITEM 245 General unpacking routine
ITEM 247 Line Image
20037260 ITEM 246 Standard Flexowriter Tab Settings
20040150 ITEM 222 DUAL routine
20041430 ITEM 160 [N] (as 149 but not in CID), used by 146
20041720 ITEM 150 Initial Entry Routine
20042020 ITEM 214 MASTER routine
E20000000 End of octal input. Enter at this address

Appendix 2

A list of all items in Section 2 of the listing in the Red Binder in the order in which they appear.

ITEM 145 DELETE ITEM routine
ITEM 131 [BS] dictionary
ITEM 132 [AS] dictionary
ITEM 133 [SS] dictionary
ITEM 129 Conventional list of 20 format classes
ITEM 169 List of dictionaries to be packed
ITEM 256 Double entry list of routine/compiling version serial numbers
ITEM 134 CID dictionary
ITEM 243 General Packing Routine for dictionaries
ITEM 228 Transfer dictionary to record store
ITEM 216 24-bit multiplication and division
ITEM 164 REPLACE ITEM routine
ITEM 155 Delete an item in the store
ITEM 175 Second entry to Delete item
ITEM 231 Transfer dictionary to chain store
REPLACE ITEM 130 [MP] =
ITEM 245 General unpacking routine
ITEM 219 Print B82 in Octal
ITEM 142 pre-editing routine
ITEM 258 Non-catastrophic fault routine
ITEM 248 Decimal printing routine
ITEM 257 CATASTROPHIC FAULT routine
REPLACE ITEM 215 ANALYSIS routine
REPLACE ITEM 261 Convert metasyntactical symbols
REPLACE ITEM 238 LINE RECONSTRUCTION routine
REPLACE ITEM 246 Standard flexowriter tab settings
ITEM 227 END OF MESSAGE routine
REPLACE ITEM 214 MASTER routine
END OF MESSAGE
REPLACE ITEM 161 Set Chain and Stack
REPLACE ITEM 227 END OF MESSAGE routine
END OF MESSAGE
REPLACE ITEM 142 Pre-editing routine
END OF MESSAGE
ITEM 218 PHRASE routine
ITEM 260 Entry to PHRASE routine used by auxiliary phrase routine
ITEM 242 Auxiliary Phrase routine
ITEM 220 FORMAT routine
ITEM 213 Read next section
ITEM 141 Look up or enter in double-entry list
ITEM 259 Add nil branch to dictonary
ITEM 204 Add word to list
ITEM 205 Add word to nest
ITEM 206 Withdraw word from nest
ITEM 207 Delete chain
ITEM 209 Add list to list
ITEM 210 Copy linear list to chain
ITEM 171 [general phrase identifier] = [[phrase identifier][phrase label][phrase index]]
ITEM 174 [phrase label] = / [N], NIL
ITEM 176 [phrase index] = ([ABN]), NIL
ITEM 151 [body of phrase definition] = [143][π] = [phrase*]
ITEM 156 [phrase*] = [phrase][phrase*], [phrase] EOS
ITEM 157 [phrase] = BUT NOT, [π or ES*] COMMA, NIL, [π or ES*]
ITEM 159 [serial number] = COMMA [N], COMMA [π or ES*], NIL
ITEM 163 [body of format defn.] = [π]=[π or ES*][serial number]EOS
ITEM 139 skeleton of A* and A?
A* ≡ A* = A A* COMMA A EOS
A? ≡ A? = A COMMA NIL EOS
ITEM 143 (CR), NIL
ITEM 265 double-entry list for serial no of routine / compiling version
ITEM 225 merge new entry into dictionary
ITEM 224 General dictionary routine
ITEM 230 [identifier] conversion routine
ITEM 172 [phrase identifier] built-in
ITEM 158 Built-in phrase for any sequence of identifiers or basic symbols
ITEM 152 Built-in phrase for phrase identifier
ITEM 160 [N] (not in CID)
ITEM 149 Built in phrase for [N]
ITEM 166 Built-in phrase for [α] and [A]
ITEM 167 Built-in phrase for [β] and [B]
ITEM 229 COMMA
ITEM 183 Print Symbol
ITEM 177 Print new format or phrase
END OF MESSAGE
ITEM 278 FIXED ITEM routine
ITEM 253 compile body of a routine
ITEM 221 ROUTINE routine
ITEM 217 Convert absolute pointers to relative pointers
ITEM 223 "Is it parameter-free?" routine
ITEM 144 Phrase: [label] = [separator*?] EOS, [separator*?][primary label]
ITEM 185 [RESOLVED-P] = [set p][152][reset p] 1, [reset p] -1
ITEM 179 [SEP] = COMMA, EOL
ITEM 184 [LABEL]
ITEM 148 [separator*?] = COMMA, EOL
ITEM 181 [PI] denotes identifier / label?/index?
ITEM 250 reset p
ITEM 244 set p'
ITEM 251 [FD]
ITEM 173 [OW]
END OF MESSAGE
ITEM 187 [AB] = [WORD] [SEP]
ITEM 188 [AB] = [WORD][OPERATOR][WORD] [SEP]
ITEM 189 ([ADDR]) = [WORD] [SEP]
ITEM 190 ([ADDR]) = [WORD][OPERATOR][WORD] [SEP]
ITEM 191 [JUMP] [LABEL] [IU] [QI] [EQV] [RESOLVED-P] [SEP]
ITEM 192 [JUMP] [LABEL] [SEP]
ITEM 235 compute value of a word
ITEM 236 compute value of an address
ITEM 211 CALL R [PI] [SEP]
ITEM 197 [AB] = CATEGORY OF [PI] [SEP]
ITEM 198 [AB] = NUMBER OF [PI] [SEP]
ITEM 202 [AB] = ADDRESS OF [PI] [SEP]
ITEM 193 LET [PI] = [GENERATED-P] [SEP]
ITEM 194 [JUMP][LABEL][IU][PI][EQV][RESOLVED-P] [SEP]
ITEM 195 LET [PI][EQV][RESOLVED -P][SEP]
ITEM 196 [JUMP][LABEL][IU][PI] = [PI][SEP]
ITEM 234 look-up ([PI]) L.S.E. routine
ITEM 232 Transplant routine
ITEM 233 look-up
ITEM 170 interpret → B82
ITEM 267 SHIFT [AB] UP [ABN] [SEP]
ITEM 268 SHIFT [AB] DOWN [ABN] [SEP]
ITEM 269 SPACE [SEP]
ITEM 270 NEWLINE [SEP]
ITEM 271 PRINT [ABN] [SEP]
ITEM 199 [FD][COMMA][WORD][COMMA][WORD][COMMA][WORD][SEP]
ITEM 200 PLANT [FD][COMMA][ABN][COMMA][ABN][COMMA][WORD]IN[B][SEP]
ITEM 203 [AB] = CLASS OF [PI] [SEP]
ITEM 201 [PI] = [AB] [SEP]
ITEM 208 CALL R [ABN] [SEP]
ITEM 212 [FD][COMMA][WORD][COMMA] 0 [COMMA]L[LABEL][SEP]
ITEM 262 END (ie. the [BI] format)
ITEM 263 [AB] = INDEX [ABN] [SEP]
ITEM 264 INDEX [ABN] = [AB] [SEP]
ITEM 273 PRINT SYMBOL [ABN] [SEP]
ITEM 277 PRINT [ABN] IN OCTAL [SEP]
END OF MESSAGE

Appendix 3

A list of all items in Section 3 of the listing in the Red Binder in the order in which they appear.

PHRASE [146] = [160]), NIL
PHRASE [147] = [BS], [182][AS], [182][SS]
PHRASE (CR) [182] = *, NIL
PHRASE [AB] = [A], [B]
PHRASE [ABN] = [A], [B], [N]
PHRASE [249] = (COMPILER), NIL
PHRASE [254] = SMALL R [160], R[160], [249][181][EQV][185]
PHRASE [186] = [152]
PHRASE (CR) [JUMP] = ->, >, JUMP, [83]
PHRASE	[OPERATOR] = +, -, X, /, &, V, #, AND, NOT EQV
PHRASE	[COMPARATOR] = =, #, >,  ≤, <, ≥, )
PHRASE	[ADDR] = [AB] + [ABN], [AB]-[ABN], [AB] (+) [ABN], [AB]
PHRASE	[WORD] = [ADDR],([ADDR]),[-?][N].[0-3],[-?].[0-3],[-?][N], [173]
PHRASE [-] = -
PHRASE [IU] = IF, UNLESS
PHRASE (CR)	[EQV] = =, (=)
PHRASE [0-3] = 00, 01, 10, 11
PHRASE [,WORD] = [COMMA] [WORD]
PHRASE [LIST OR NEST] = LIST , NEST
FORMAT [BS] =[AB] = [WORD][SEP], 187
FORMAT [BS] =[AB] = [WORD][OPERATOR][WORD][SEP], 188
FORMAT [BS] =[AB] = ADDRESS OF [PI][SEP], 202
FORMAT [BS] =[AB] = CATEGORY OF [PI][SEP], 197
FORMAT [BS] =[AB] = CLASS OF [PI][SEP], 203
FORMAT [BS] =[AB] = NUMBER OF [PI][SEP], 198
FORMAT [BS] =[AB] = INDEX [ABN][SEP], 263
FORMAT [BS] =([ADDR]) = [WORD][SEP], 189
FORMAT [BS] =([ADDR]) = [WORD][OPERATOR][WORD][SEP], 190
FORMAT [BS] =LET [PI][EQV][RESOLVED -P][SEP], 195
FORMAT [BS] =LET [PI] = [GENERATED - P][SEP], 193
FORMAT [BS] =[JUMP][LABEL][SEP], 192
FORMAT [BS] =[JUMP][LABEL][IU][WORD][COMPARATOR][WORD][SEP], 191
FORMAT [BS] =[JUMP][LABEL][IU][PI][EQV][RESOLVED - P][SEP], 194
FORMAT [BS] =[JUMP][LABEL][IU][PI] = [PI][SEP], 196
FORMAT [BS] =PRINT [ABN] IN OCTAL [SEP] , 277
FORMAT [BS] =PRINT [ABN][SEP], 271
FORMAT [BS] =PRINT SYMBOL [ABN][SEP],273
FORMAT [BS] =PLANT [FD][COMMA][ABN][COMMA][ABN][COMMA][WORD]IN[B][SEP],200
FORMAT [BS] =[FD][COMMA][WORD][COMMA][WORD][COMMA][WORD][SEP], 199
FORMAT [BS] =[FD][COMMA][WORD][COMMA] 0 [COMMA]L[LABEL][SEP], 212
FORMAT [BS] =[PI]= [AB][SEP], 201
FORMAT [BS] =CALL R [ABN][SEP], 208
FORMAT [BS] =CALL R [PI][SEP], 211
FORMAT [BS] =END[SEP], 262
FORMAT [BS] =INDEX [ABN] = [AB][SEP], 264
FORMAT [BS] =SHIFT [AB] UP [ABN][SEP], 267
FORMAT [BS] =SHIFT [AB] DOWN [ABN][SEP], 268
FORMAT [BS] =SPACE [SEP], 269
FORMAT [BS] =NEWLINE [SEP], 270
FORMAT [BS] =[WORD]/[WORD][SEP]
FORMAT [MP] = END OF PRIMARY MATERIAL, 226
FORMAT [MP] = ROUTINE, 221
FORMAT [MP] = BUILT-IN PHRASE, 292
FORMAT [MP] = DEFINE COMPILER, 275
FORMAT [MP] = AMEND COMPILER, 276
FORMAT [MP] = FIXED ITEM , 278
FORMAT [MP] = SLIDE COMPILER UP A BLOCK , 281
FORMAT [AS] = [AB] = [LIST OR NEST][WORD][SEP]
FORMAT [AS] = [AB] = [LIST OR NEST]([WORD][, WORD*])[SEP]
FORMAT [AS] = [AB] = LIST [PI][SEP]
FORMAT [AS] = [AB] = LIST [AB]([ABN][COMMA]?)[SEP]
FORMAT [AS] = [AB] = VALUE OF LIST [AB] IN DICT [AB][SEP]
FORMAT [AS] = [AB] = CONVENTIONAL LIST OF [ABN] WORDS [SEP]
FORMAT [AS] = DELETE CONVENTIONAL LIST [AB][SEP]
FORMAT [AS] = DELETE [LIST OR NEST] [AB][SEP]
FORMAT [AS] = DELETE LIST [AB] FROM DICT [AB][SEP]
FORMAT [AS] = ADD ([WORD][, WORD*]) TO [LIST OR NEST][AB][SEP]
FORMAT [AS] = ADD [WORD] TO [LIST OR NEST][AB][SEP]
FORMAT [AS] = ADD LIST [AB][COMMA][WORD] TO DICT [AB][SEP]
FORMAT [AS] = ASSIGN VALUE [ABN] TO [PI][SEP]
FORMAT [AS] = ANALYSE LIST [AB] W.R.T. [PI][SEP]
FORMAT [AS] = WITHDRAW [AB] FROM NEST [AB][SEP]
FORMAT [AS] = LIST [AB] = LIST [AB] + LIST [AB][SEP]
FORMAT [AS] = LIST [AB] = ENTRY WITH VALUE [AB] IN DICT [AB][SEP]
FORMAT [AS] = LIST [AB] = NEXT LINE FROM INPUT [N][SEP]
FORMAT [AS] = LIST [AB] = NEXT RECONSTRUCTED LINE [SEP]
FORMAT [AS] = CONVERT [PI] TO [AB][SEP]
FORMAT [AS] = CALL [PI] COMPILER [GENERATED-P]
FORMAT [AS] = MONITOR ([ALL SYMBOLS EXCEPT RT BRACKET])[SEP]
FORMAT [AS] = PRINT LIST [ABN][SEP]
ROUTINE [AS] ≡ ADD [WORD] TO [LIST OR NEST][AB][SEP]
ROUTINE (COMPILER) [BS] ≡ [AB/1] = [WORD][SEP]
ROUTINE [AS] ≡ CALL[PI] COMPILER [GENERATED-P]
ROUTINE(COMPILER)[BS] ≡ ([ADDR]) = [WORD][SEP]
ROUTINE (COMPILER) [BS] ≡ PLANT
[FD][COMMA][ABN/1][COMMA][ABN/2][COMMA][WORD]IN[B][SEP]
ROUTINE (COMPILER)[BS] ≡ -> [LABEL][IU][WORD/1][COMPARATOR][WORD/2][SEP]
ROUTINE (COMPILER)[BS] ≡ [AB] = [WORD/1][OPERATOR][WORD/2][SEP]
ROUTINE (COMPILER)[AS] ≡ ADD [WORD] TO [LIST OR NEST][AB][SEP]
ROUTINE (COMPILER) [BS] ≡ [AB] = CATEGORY OF [PI] [SEP]
ROUTINE (COMPILER) [BS] ≡ [AB] = ADDRESS OF [PI] [SEP]
ROUTINE (COMPILER) [BS] ≡ LET [PI] ≡ [RESOLVED-P][SEP]
ROUTINE (COMPILER) [BS] ≡ -> [LABEL][IU][PI] ≡ [RESOLVED-P][SEP]
ROUTINE (COMPILER) [BS] ≡ -> [LABEL][SEP]
ROUTINE (COMPILER) [BS] ≡ SHIFT [AB] UP [ABN] [SEP]
ROUTINE (COMPILER) [BS] ≡ SHIFT [AB] DOWN [ABN] [SEP]
ROUTINE(COMPILER)[BS] ≡ [FD][COMMA][WORD/1][COMMA][WORD/2][COMMA][WORD/3][SEP]
ROUTINE (COMPILER) [BS] ≡ ([ADDR]) = [WORD/1][OPERATOR][WORD/2][SEP]
ROUTINE(COMPILER) [BS] ≡ END[SEP]
ROUTINE (COMPILER) [BS] ≡ [AB/1] = [WORD][SEP]
ROUTINE(COMPILER) [BS] ≡ ([ADDR]) = [WORD] [SEP]
ROUTINE (COMPILER) [BS] ≡
PLANT[FD][COMMA][ABN/1][COMMA][ABN/2][COMMA][WORD]IN[B][SEP]
ROUTINE (COMPILER)[BS] ≡ -> [LABEL][IU][WORD/1][COMPARATOR][WORD/2][SEP]
ROUTINE (COMPILER)[BS] ≡ [AB] = [WORD/1][OPERATOR][WORD/2][SEP]
ROUTINE (COMPILER)[AS] ≡ ADD [WORD] TO [LIST OR NEST][AB][SEP]
ROUTINE (COMPILER) [BS] ≡ [AB] = CATEGORY OF [PI] [SEP]
ROUTINE (COMPILER) [BS] ≡ [AB] = ADDRESS OF [PI] [SEP]
ROUTINE (COMPILER) [BS] ≡ LET [PI] ≡ [RESOLVED-P][SEP]
ROUTINE (COMPILER) [BS] ≡ -> [LABEL][IU][PI] ≡ [RESOLVED-P][SEP]
ROUTINE (COMPILER) [BS] ≡ SHIFT [AB] UP [ABN] [SEP]
ROUTINE (COMPILER) [BS] ≡ SHIFT [AB] DOWN [ABN] [SEP]
ROUTINE (COMPILER)[BS] ≡ -> [LABEL][SEP]
ROUTINE(COMPILER)[BS] ≡ [FD][COMMA][WORD/1][COMMA][WORD/2][COMMA][WORD/3][SEP]
ROUTINE (COMPILER) [BS] ≡ ([ADDR]) = [WORD/1][OPERATOR][WORD/2][SEP]
ROUTINE(COMPILER) [BS] ≡ END[SEP]
ROUTINE (COMPILER)[BS] ≡ PRINT SYMBOL[ABN][SEP]
ROUTINE (COMPILER) [BS] ≡ [AB] = NUMBER OF [PI][SEP]
ROUTINE(COMPILER) [BS] ≡ [AB] = CLASS OF [PI][SEP]
ROUTINE (COMPILER)[BS] ≡ INDEX [ABN] = [AB][SEP]
ROUTINE (COMPILER) [BS] ≡ [AB]= INDEX [ABN][SEP]
ROUTINE (COMPILER) [BS] ≡ SPACE [SEP]
ROUTINE (COMPILER)[BS] ≡ NEWLINE [SEP]
ROUTINE (COMPILER)[BS] ≡ CALL R [ABN] [SEP]
ROUTINE (COMPILER) [BS] ≡ PRINT [ABN][SEP]
ROUTINE (COMPILER)[BS] ≡ [FD][COMMA][WORD][COMMA] 0 [COMMA] L [LABEL]
ROUTINE (COMPILER)[BS] ≡ [WORD/1]/[WORD/2][SEP]
ROUTINE (COMPILER) [BS] ≡ PRINT [ABN] IN OCTAL [SEP]
ROUTINE [MP] ≡ FORMAT CLASS
ROUTINE [MP] ≡ BUILT-IN PHRASE
BUILT-IN PHRASE [ALL SYMBOLS EXCEPT RT BRACKET]
ROUTINE R 180
FORMAT [SS] = POPI [WORD] TO [WORD][EOL]
ROUTINE [SS] ≡ POPI [WORD/1] TO [WORD/2][EOL]
END OF MESSAGE
PHRASE [NOTE'] = [COMMA]|[NOTE],NIL
PHRASE [TABLE LABEL] = [N]:[TABLE LABEL],NIL
FORMAT [AS] = PLANT [AB]TH ORDER OF TABLE [TABLE] IN [B][SEP]
FORMAT [AS] = PLANT TABLE [TABLE] IN [B][SEP]
FORMAT [AS] = |[NOTE][SEP]
BUILT-IN PHRASE [NOTE]
ROUTINE (COMPILER) [AS] ≡ |[NOTE][SEP]
PHRASE[TABLE] = [TABLE ENTRY][REST OF TABLE]
PHRASE [TABLE ENTRY] = [68][TABLE
LABEL][FD][COMMA][αβN][COMMA][αβN][COMMA][WORD][NOTE']
PHRASE[REST OF TABLE] = [TABLE ENTRY][REST OF TABLE],NIL
ROUTINE(COMPILER)[AS] ≡ PLANT[αβ]TH ORDER OF TABLE [TABLE]IN[β][SEP]
ROUTINE(COMPILER) [AS] ≡ PLANT TABLE [TABLE] IN [β][SEP]
ROUTINE [AS] ≡ [AB/1] = LIST [AB/2]([ABN/3],?)[SEP]
ROUTINE [AS] ≡ MONITOR ([ALL SYMBOLS EXCEPT RT BRACKET])[SEP]
ROUTINE [AS] ≡ LIST[AB] = NEXT RECONSTRUCTED LINE[SEP]
ROUTINE [AS] ≡ [AB] = [LIST OR NEST][WORD][SEP]
ROUTINE [AS] ≡ [AB] = [LIST OR NEST]([WORD/1][, WORD*])[SEP]
ROUTINE [AS] ≡ [AB/1] = VALUE OF LIST [AB/2] IN DICT [AB/3][SEP]
ROUTINE [AS] ≡ DELETE CONVENTIONAL LIST [AB][SEP]
ROUTINE [AS] ≡ DELETE LIST [AB/1] FROM DICT [AB/2][SEP]
ROUTINE [AS] ≡ WITHDRAW [AB/1] FROM NEST [AB/2][SEP]
ROUTINE [AS] ≡ LIST [AB/1] = LIST [AB/2] + LIST [AB/3][SEP]
ROUTINE [AS] ≡ LIST [AB/1] = ENTRY WITH VALUE [AB/2] IN DICT [AB/3][SEP]
ROUTINE [AS] ≡ ADD ([WORD][, WORD*]) TO [LIST OR NEST] [AB][SEP]
ROUTINE [AS] ≡ [AB] = CONVENTIONAL LIST OF [ABN] WORDS [SEP]
ROUTINE [AS] ≡ ASSIGN VALUE [ABN] TO [PI][SEP]
ROUTINE [AS] ≡ PRINT LIST [ABN] [SEP]
ROUTINE [AS] ≡ ANALYSE LIST [AB] W.R.T. [PI] [SEP]
ROUTINE [AS] ≡ ADD LIST [AB/1] [COMMA] [WORD] TO DICT [AB/2] [SEP]
ROUTINE [AS] ≡ DELETE [LIST OR NEST] [AB] [SEP]
ROUTINE (COMPILER)[AS] ≡ [AB/1] = LIST [AB/2]([ABN][COMMA]?)[SEP]
ROUTINE (COMPILER)[AS] ≡ DELETE [LIST OR NEST][AB][SEP]
ROUTINE (COMPILER)[AS] ≡ LIST [AB] = NEXT RECONSTRUCTED LINE [SEP]
ROUTINE (COMPILER) [AS] ≡ [AB] = [LIST OR NEST][WORD][SEP]
ROUTINE (COMPILER)[AS] ≡ ADD ([WORD][,WORD*]) TO [LIST OR NEST][AB][SEP]
ROUTINE (COMPILER) [AS] ≡ [AB] = [LIST OR NEST]([WORD][,WORD*])[SEP]
ROUTINE (COMPILER)[AS] ≡ WITHDRAW [AB/1] FROM NEST [AB/2][SEP]
ROUTINE (COMPILER)[AS] ≡ LIST [AB/1] = LIST [AB/2] + LIST [AB/3][SEP]
FORMAT [AS] = [αβ] = UPPER LIMIT OF [αβ] IN DICT [αβ][SEP]
ROUTINE [AS] ≡ [αβ/1] = UPPER LIMIT OF [αβ/2] IN DICT [αβ/3][SEP]
FORMAT [AS] = [αβ] = LIST FOR [αβ] IN CLASS [αβN][SEP]
ROUTINE [AS] ≡ [αβ] = LIST FOR [αβ/1] IN CLASS [αβN][SEP]
ROUTINE [AS] ≡ [αβ] = LIST [PI][SEP]
ROUTINE (COMPILER) [AS] ≡ MONITOR ([ALL SYMBOLS EXCEPT RT BRACKET]) [SEP]
ITEM 274
REPLACE ITEM 150
FORMAT [AS] = PRINT B-LINES [SEP]
ROUTINE (COMPILER) [AS] ≡ PRINT B-LINES [SEP]
ROUTINE SMALL R 283
DELETE ITEM 257
ROUTINE R 257
DELETE ITEM 258
ROUTINE R 258
END OF MESSAGE
ROUTINE [MP] ≡ DEFINE COMPILER
ROUTINE R 226
ROUTINE R 237
ROUTINE [AS] ≡ CONVERT [PI] TO [AB] [SEP]
FORMAT [AS] = CALL BUILT-IN PHRASE [PI][SEP]
FORMAT [AS] = PRESERVE ANALYSIS B-LINES [SEP]
FORMAT [AS] = RESTORE ANALYSIS B-LINES [SEP]
ROUTINE(COMPILER)[AS] ≡ CALL BUILT-IN PHRASE [PI][SEP]
ROUTINE(COMPILER)[AS] ≡ PRESERVE ANALYSIS B-LINES [SEP]
ROUTINE(COMPILER)[AS] ≡ RESTORE ANALYSIS B-LINES [SEP]
FIXED ITEM 0
FIXED ITEM 281
FIXED ITEM 135
FIXED ITEM 279
I280
REPLACE ITEM142
END OF MESSAGE
DEFINE COMPILER CC1
COMPILER COMPILER (CC1)
⇑ Top of page
© Chilton Computing and UKRI Science and Technology Facilities Council webmaster@chilton-computing.org.uk
Our thanks to UKRI Science and Technology Facilities Council for hosting this site