<<

Reprinted from the COMMUNICATIONS OF THE ASSOCIATION FOR MACHINERY Vol. 3, No.5, May 1960 Made in U.S.A. With tYPographical corrections as of June ~8, 1980 Report on the Algorithmic Language ALGOL 60

PETER NAUR (Editor) J. W. BACKUS . KATZ H. RUTISHAUSER J. H. WEGSTEIN F.L.BAUER J. MCCARTHY K. SAMELSON A. VAN WIJNGAARDEN J. GREEN A. J. PERLIS . VAUQUOIS M. WOODGER

Dedicated to the Memory of WILLIAM TURANSKI

INTRODUCTION

Background Meanwhile, in the United States, anyone who wished to After the publication of a preliminary report on the suggest changes or corrections to ALGOL was requested to send his comments to the ACM Communications where algorithmic language ALGOL,!' 2 as prepared at a conference in Zurich in 1958, much interest in the ALGOL language they were published. These comments then became the developed. basis of consideration for changes in the ALGOL language. As a result of an informal meeting held at Mainz in Both the SHARE and USE organizations established November 1958, about forty interested persons from ALGOL working groups, and both organizations were several European countries held an ALGOL implementation represented on the ACM Committee on Programming conference in Copenhagen in February 1959. A "hardware Languages. The ACM Committee met in Washington in group" was formed for working cooperatively right down November 1959 and considered all comments on ALGOL to the level of the paper tape code. This conference also that had been sent to the ACM Communications. Also, led to the publication by , Copenhagen, of seven representatives were selected to attend the January an ALGOL Bulletin, edited by , which served 1960 international conference. These seven representa­ as a forum for further discussion. During the June 1959 tives held a final preparatory meeting in Boston in Decem­ ICIP Conference in Paris several meetings, both formal ber 1959. and informal ones, were held. These meetings revealed January 1960 Conference some misunderstandings as to the intent of the group The thirteen representatives," from , England, which was primarily responsible for the formulation of the France, Germany, Holland, Switzerland, and the United language, but at the same time made it clear that there States, conferred in Paris from January 11 to 16, 1960. exists a wide appreciation of the effort involved. As a re­ Prior to this meeting a completely new draft report was sult of the discussions it was decided to hold an inter­ worked out from the preliminary report and the recom­ national meeting in January 1960 for improving the mendations of the preparatory meetings by Peter Naur ALGOL language and preparing a final report. At a Euro­ and the conference adopted this new form as the basis pean ALGOL Conference in Paris in November 1959 which for its report. The Conference then proceeded to work for was attended by about fifty people, seven European agreement on each item of the report. The present report representatives were selected-to attend the January 1960 represents the union of the Committee's concepts and the Conference, and they represent the following organiza­ intersection of its agreements. tions: Association Francaise de Calcul, British Society, Gesellschaft fur Angewandte Mathematik und As with the preliminary ALGOL report, three different . Mechanik, and Nederlands Rekenmachine Genootschap. levels of language are recognized, namely a Reference The seven representatives held a final preparatory meeting Language, a Publication Language and several Hardware at Mainz in December 1959. Representations.

I Preliminary report-International Algebraic Language, REFERENCE LANGUAGE Comm. A8soc. Camp. . 1, No. 12 (1958),8. 1. It is the working language of the committee. 2 Report on the Algorithmic Language ALGOL by the ACM 2. It is the defining language. Committee on Programming Languages and the GAMM Com­ mittee on Programming, edited by A. J. Perlis and K. Samelson, S William Turanski of the American group was killed by an Numerische Mathematik Bd. 1, S. 41-60 (1959). automobile just prior to the January 1960 Conference.

Communications of the ACM 299 3. The characters are determined by ease of mutual HARDWARE REPRESENTATIONS understanding and not by any computer limitations, coders 1. Each one of these is a condensation of the reference notation, or pure mathematical notation. language enforced by the limited number of characters on 4. It is the reference and guide for standard input equipment. builders. 2. Each one of these uses the character set of a particu­ 5. It is the guide for all hardware representations. lar computer and is the language accepted by a translator 6. It is the guide for transliterating from publication for that computer. language to any locally appropriate hardware representa­ 3. Each one of these must be accompanied by a special tions. set of rules for transliterating from Publication or Refer­ 7. The main publications of the ALGOL language itself ence language. will use the reference representation. For transliteration between the reference language and PUBLICATION LANGUAGE a language suitable for publications, among others, the following rules are recommended. 1. The publication language admits variations of the reference language according to usage of printing and Reference Language Publication Language Subscript bracket [] Lowering of the line between the handwriting (e.g., subscripts, spaces, exponents, Greek brackets and removal of the brackets letters). Exponentation i Raising of the exponent 2. It is used for stating and communicating processes. Parentheses () Any form of parentheses, brackets, 3. The characters to be used may be different in differ­ braces Basis of ten 10 Raising of the ten and of the following ent countries, but univocal correspondence. with reference integral number, inserting of the representation must be secured. intended multiplication sign ..

DESCRIPTION OF THE REFERENCE LANGUAGE

WaB sieh liberhaupt sagen lasst, IIlsBt sich klar sagen; und wovon man nicht reden kann, daruber mUBB man sehweigen. LUDWIG WITTGENBTEIN.

1. Structure of the Language Sequences of statements may be combined into compound As stated in the introduction, the algorithmic language statements by insertion of statement brackets. has three different kinds of representations-reference, Statements are supported by declarations which are not hardware, and publication-and the development de­ themselves computing instructions, but inform the trans­ scribed in the sequel is in terms of the reference representa­ lator of the existence and of certain properties of objects tion. This means that all objects defined within the appearing in statements, such as the class of numbers language are represented by a given set of symbols-and taken on as values by a variable, the dimension of an it is only in the choice of symbols that the other two array of numbers, or even the set of rules defining a func­ representations may differ. Structure and content must tion. Each declaration is attached to and valid for one be the same for all representations. compound statement. A compound statement which in­ The purpose of the algorithmic language is to describe cludes declarations is called a . computational processes. The basic concept used for the A program is a self-contained compound statement, i.e, description of calculating rules is the well-known arithmetic a compound statement which is not contained within expression containing as constituents numbers, variables, another compound statement and which makes no use of and functions. From such expressions are compounded, other compoundstatements not contained within it. by applying rules of arithmetic composition, self-con­ In the sequel the syntax and of the language 4 tained units of the language-explicit formulae-called will be given. assignment statements. To show the flow of computational processes, certain 4 Whenever the precision of arithmetic is stated as being in nonarithmetic statements and statement clauses are general not specified, or the outcome of a certain process is said to added which may describe, e.g., alternatives, or iterative be undefined, this is to be interpreted in the sense that a program only fully defines a computational process if the accompanying repetitions of computing statements. Since it is necessary information specifies the precision assumed, the kind of arithmetic for the function of these statements that one statement assumed, and the course of action to be taken in all such cases as refer to another, statements may be provided with labels. may occur during the execution of the computation.

300 Communications of the ACM 1.1. FORMALISM FOR SYNTACTIC DESCRIPTION Letters do not have individual meaning. They are used The syntax will be described with the aid of metalinguis­ for forming identifiers and strings" (cf. sections 2.4. tic formulae." Their interpretation is best explained by an Identifiers, 2.6. Strings). example 2.2.1. DIGITS (ab) ::= (I [I (ab) (I (ab)(d) (digit) ::= 0111213141516171819 Sequences of characters enclosed in the brackets ( ) repre­ Digits are used for forming numbers, identifiers, and sent metalinguistic variables whose values are sequences strings. of symbols. The marks :: = and I (the latter with the meaning of or) are metalinguistic connectives. Any mark 2.2.2. LOGICAL VALUES in a formula, which is not a variable or a connective, (logical value) :: = truelfalse denotes itself (or the class of marks which are similar to it). Juxtaposition of marks and/or variables in a formula The logical values have a fixed obvious meaning. signifies juxtaposition of the sequences denoted. Thus the 2.3. DELIMITERS formula above gives a recursive rule for the formation of (delimiter) :: = (operator) I(separator)I(bracketjj(deelarator)I values of the variable (ab). It indicates that (ab) may have (specificator) the value ( or [or that given some legitimate value of (operator) .. - (arithmetic operator)I()I (ab), another may be formed by following it with the (logical operator)I(sequential operator) character (or by following it with some value of the (arithmetic operator) ::= +1-lxIII+li (relational operator) :: = < I~ I= I?; I> l;e variable (d). If the values of (d) are the decimal digits, (logical operator) :: = =I::)IVIAh some values of (ab) are: (sequential operator) :: = go toliflthenlelselforldo7 (separator) :: = ,I. hoi: Ijl: = Iiii Istepluntillwhilelcomment t« (1(37( (bracket) :: = (J)1[[11'1' [begfnjond (12345 ( (declarator) .. - ownlBooleanlintegerlreallarraylswitchl «( procedure [86 (specificator) :: = stringllabellvalue In order to facilitate the study, the symbols used for Delimiters have a fixed meaning which for the most part is obvious or else will be given at the appropriate distinguishing the metalinguistic variables (i.e. the se­ quences of characters appearing within the brackets () place in the sequel. Typographical features such as blank space or change as ab in the above example) have been chosen to be words describing approximately the nature of the corresponding to a new line have no significance in the reference language. variable. Where words which have appeared in this manner They may, however, be used freely for facilitating reading. are used elsewhere in the text they will refer to the corre­ For the purpose of including text among the symbols of sponding syntactic definition. In addition some formulae a program the following "comment" conventions hold: have been given in more than one place. The sequence of basic symbols: is equivalent with j comment (any sequence not containing ;); Definition: begin comment (any sequence not containing j) j begin end (any sequence not containing end or ; or else) end (empty) :: = (i.e. the null string of symbols). By equivalence is here meant that any of the three sym­ bols shown in the right-hand column may, in anyoccur­ 2. Basic Symbols, Identifiers,Numbers, and Strings. rence outside of strings, be replaced by any sequence of Basic Concepts. symbols of the structure shown in the same line of the The reference language is built up from the following left-hand column without any effect on the action of the basic symbols: program.

(basic symbol) :: = (letter)l(digit)l(logical value)l(delimiter) 2.4. IDENTIFIERS 2.4.1. Syntax 2.1. LETTERS (identifier) :: = (letter)I(identifier)(letter)I(identifier)(digit) (letter) :: = alblcldlelflglhlilj Iklllmlnlolplqlrlsltlulv.lwlxlYlz I AIBICIDIEIFIGIHIIIJIKILIMINIOIPIQIRISITlulVIWIXIYIZ 6 It should be particularly noted that throughout the reference This alphabet may arbitrarily be restricted, or extended language underlining (for typographical reasons synonymously with any other distinctive character (i.e. character not bold type) is used for defining independent basic symbols (see coinciding with any digit, logical value or delimiter). sections 2.2.2 and 2.3). These are understood to have no relation to the individual letters of which they are composed. Within the present report boldface will be used for no other purpose. 6 Cf. J. W. Backus, The syntax and semantics of the proposed 7 do is used in for statements. It has no relation whatsoever to international algebraic language of the Zurich ACM-GAMM the do of the preliminary report, which is not included in ALGOL conference. ICIP Paris, June 1959. 60.

Communications of the ACM 301 2.4.2. Examples Strings are used as actual parameters of procedures q (cf. sections 3.2. Function Designators and 4.7. Procedure Soup Statements). V17a a34kTMNs 2.7. QUANTITIES, KINDS AND SCOPES MARILYN The following kinds of quantities are distinguished: 2.4.3. Semantics simple variables, arrays, labels, switches, and procedures. The of a quantity is the set of statements in which Identifiers have no inherent meaning, but serve for the the. declaration for the identifier associated with that identification of simple variables, arrays, labels, switches, quantity is valid, or, for labels, the set of statements and procedures. They may be chosen freely (cf., however, which may have the statement in which the label occurs section 3.2.4. Standard Functions). as their successor. The same identifier cannot be used to denote two differ­ ent quantities except when these quantities have disjoint 2.8. VALUES AND TYPES scopes as defined by the declarations of the program (cf. A value is an ordered set of numbers (special case: a section 2.7. Quantities, Kinds and Scopes, and section 5. single number), an ordered set of logical values (special Declarations). case: a single logical value), or a label. 2.5. NUMBERS Certain of the syntactic units are said to possess values. 2.5.1. Syntax These values will in general change during the execution of the program. The values of expressions and their con­ (unsigned integer) :: = (digit)I(unsigned integer)(digit) stituents are defined in section 3. The value of an array (integer) :: = (unsigned integerjj-l-tunsigned integer)I identifier is the ordered set of values of the corresponding - (unsigned integer) (decimal fraction) :: = . (unsigned integer) array of subscripted variables (cf. section 3.1.4.1). (exponent part) :: = 10(integer) The various "types" (integer, real, Boolean) basically (decimal number) :: = (unsigned integer)I(decimal fraction)I denote properties of values. The types associated with (unsigned integer)(decimal fraction) syntactic units refer to the values of these units. (unsigned number) :: = (decimal numberjkexponent parti] (decimal number)(exponent part) 3. Expressions (number) :: = (unsigned number)I+(unsigned numberi] - (unsigned number) In the language the primary constituents of the programs describing algorithmic processes are arithmetic, Boolean, 2.5.2. Examples and designational, expressions. Constituents of these o -200.084 -.08310-02 expressions, except for certain delimiters, are logical 177 +07.43108 - 107 values, numbers, variables, function designators, and .5384 9.34 10+10 10- 4 elementary arithmetic, relational, logical, and sequential, +0.7300 210-4 +10+5 operators. Since the syntactic definition of both variables 2.5.3. Semantics and function designators contains expressions, tIle defini­ Decimal numbers have their conventional meaning. tion of expressions, and their constituents, is necessarily The exponent part is a scale factor expressed as an integral recursive. power of 10. (expression) :: = (arithmetic expressionjjclsooloan expression)I 2.5.4. Types (designational expression) Integers are of type integer. All other numbers are of type real (cf. section 5.1. Type Declarations). 3.1. VARIABLES 3.1.1. Syntax 2.6. STRINGS 2.6.1. Syntax (variable identifier) :: = (identifier) (simple variable) :: = (variable identifier) (proper string) :: = (any sequence of basic symbols not containing (subscript expression) :: = (arithmetic expression) , or ' >l

302 Communications of the ACM value may be used in expressions for forming other values abs(E) for the modulus (absolute value) of the value of the and may be changed at will by means of assignment state­ expression E ments (section 4.2). The type of the value of a particular sign(E) for the sign of the value of E(+1 for E>O, 0 for E=O, -1 for E

7.39410-8 3.2.3. Semantics sum Function designators define single numerical or logical w[i+2,8] values, which result through the application of given sets cos(y+zX3) of rules defined by a procedure declaration (cf. section (a-3/y+vuj8) 5.4. Procedure Declarations) to fixed sets of actual param­ Factors: eters. The rules governing specification of actual param­ eters are given in section 4.7. Procedure Statements. Not omega sum'[costy-l-sx S) every procedure declaration defines the value of a func­ 7.39410-8jw[i+2,8]j(a-3/y+vuj8) tion designator. 3.2.4. Standard functions Terms: Certain identifiers should be reserved for the standard ~ U functions of analysis, which will be expressed as procedures. omegaXsumjcos(y-l-z X3)/7.3941O-8jw[i+2,8]j It is recommended that this reserved list should contain: (a-3/y+vu-8)

Communications of the ACM 303 Simple arithmetic expression: (factor) both denote division, to be understood as a multi­ plication of the term by the reciprocal of the factor with U- Yu-l-omega.xsum'[eos (y+zX3)/7.3941O-Siw[i+2,SJl (a-3/y+vuiS) due regard to the rules of precedence (cf. section 3.3.5). Thus for example Arithmetic expressions: a/bX7/(p-q)Xv/s wXu-Q(S+Cu)i2 if q>O then S+3XQ/A else2XS+3Xq means if aI7 then U/V else if l k~y then V/U else ° « «aX (b- »X7) X «p-q)-I» Xv) X (S-I) aXsin(omegaXt) The operator / is defined for all four combinations of 0.57toI2Xa[NX (N -1)/2, OJ (AXarctan(y) + Z)i(7 + Q) types real and integer and will yield results of real type if q then n -1 else n in any case. The operator + is defined only for two if a

304 Communications of the ACM from the mathematically defined result in any arithmetic 3.4.6. Precedence of operators expression is explicitly understood. No exact arithmetic The sequence of operations within one expression is will be specified, however, and it is indeed understood generally from left to right, with the following additional that different hardware representations may evaluate rules: arithmetic expressions differently. The control of the 3.4.6.1. According to the syntax given in section 3.4.1 possible consequences of such differences must be carried the following rules of precedence hold: out by the methods of numerical analysis. This control must be considered a part of the process to be described, first: arithmetic expressions according to section 3.3.5. second: < ~ = 6: > ~ and will therefore be expressed in terms of the language third:' , itself. fourth: ;\ fifth: V 3.4. BOOLEAN EXPRESSIONS sixth: :::> 3.4.1. Syntax seventh: = 3.4.6.2. The use of parentheses will be interpreted in (relational operator) :: = < I~ 1= 16: I> I~ (relation) :: = (arithmetic expressionxrelational operator) the sense given in section 3.3.5.2. (arithmetic expression) (Boolean primary) :: = (logical value) 1(variable) I 3.5. DESIGNATIONAL EXPRESSIONS (function designator)I(relation)I«Boolean expression» 3.5.1. Syntax (Boolean secondary) :: = (Boolean primary)h (Boolean primary) (Boolean factor) :: = (Boolean secondary)I (label) :: = (identifier) 1 (unsigned integer) (Boolean factor);\(Boolean secondary) (switch identifier) :: = (identifier) (Boolean term) :: = (Boolean factor)I(Boolean term) (switch designator) :: = (switch identifier)[(subscript expression)] V(Boolean factor) (simple designational expression) :: = (label)I(switch designator)I (implication) :: = (Boolean term[(implication):::>(Boolean term) «designational expressionr) (simple Boolean):: = (implication)I (designational expression) :: = (simple designational expression)[ (simple Boolean)=(implication) (if clause)(simple designational expression) else (Boolean expression) :: = (simple Booleam] (designational expression) (if clause)(simple Boolean) else (Boolean expression) 3.5.2. Examples 3.4.2. Examples 17 x= -2 p9 Y>V V z -5;\ z-d > qi2 Town[ify, f if kw else h~c 3.5.3. Semantics if if if a then b else c then d else f then g else h (implies), and == (equivalent), is given by the The evaluation of the subscript expression is analogous following function table. to that of subscripted variables (cf. section 3.1.4.2). The value of a switch designator is defined only if the subscript bi false false true true expression assumes one of the positive values 1, 2, 3, ... , b2------false true false true n, where n is the number of entries in the switch list. ,bI true true false false 3.5.5. Unsigned integers as labels bI;\b2 false false false true Unsigned integers used as labels have the property that bIVb2 false true true true bI:::>b2 true true false true leading zeroes do not affect their meaning, e.g. 00217 bI_b2 true false false true denotes the same label as 217.

Communications of the ACM 305 4. Statements Block: The units of operation within the language are called Q: begin integer i, k ; real w statements. They will normally be executed consecutively for i : = 1 step 1 until m do as written. However, this sequence of operations may be for k : = i-l-I step 1 until m do begin w : = A[i, k] ; go to broken by statements, which define their successor A[i, k] : = A[k, i] ; explicitly, and shortened by conditional statements, which A[k, i] : = wend for i and k may cause certain statements to be skipped. end block Q In order to make itpossible to define a specific dynamic 4.1.3. Semantics succession, statements may be provided with labels. Every block automatically introduces a new level of Since sequences of statements may be grouped together nomenclature. This is realized as follows: Any identifier into compound statements and blocks the definition of occurring within the block may through a suitable declara­ statement must necessarily be recursive. Also since tion (cf. section 5. Declarations) be specified to be local declarations, described in section 5, enter fundamentally to the block in question. This means (a) that the entity into the syntactic structure, the syntactic definition of represented by this identifier inside the block has no statements must suppose declarations to be already de­ existence outside it, and (b) that any entity represented fined. by this identifier outside the block is completely inacces­ 4.1. COMPOUND STATEMENTS AND BLOCKS sible inside the block. . 4.1.1. Syntax Identifiers (except those representing labels) occurring (unlabelled basic statement) :: = (assignment statement)I within a block and not being declared to this block will be (go to statement)I(dummy statement)[(procedure statement) nonlocal to it, i.e. will represent the same entity inside (basic statement) :: = (unlabelled basic statement)I(label): the block and in the level immediately outside it. The (basic statement) exception to this rule is presented by labels, which are (unconditional statement) :: = (basicstatement)[(for statement)I local to the block in which they occur. (compound statement)[(block) (statement) :: = (unconditional statement)[ Since a statement of a block may again itself be a block (conditional statement) the concepts local and non-local to a block must be under­ (compound tail) :: = (statement) end [(statement) stood recursively. Thus an identifier, which is non-local (compound tail) to a block A, mayor may not be non-local to the block B (block head) :: = begin(declaration)I(block head) in which A is one statement. (declaration) (unlabelled compound) :: = begin (compound tail) 4.2. ASSIGNMENT STATEMENTS (unlabelled block) :: = (block head) ; (compound tail) (compound statement) :: = (unlabelled compound)[ 4.2.1. Syntax (label): (compound statement) (left part) :: = (variable) : = (block):: = (unlabelled block)I(label): (block) (left part list) : : = (left part)[(left part list)(left part) This syntax may be illustrated as follows: Denoting (assignment statement) :: = (left part list)(arithmetic expression)I (left part list)(Boolean expression) arbitrary statements, declarations, and labels, by the letters S, D, and L, respectively, the basic syntactic units 4.2.2. Examples take the forms: s := prO] := n:= n+1+s Compound statement: ' n := n+1 A := B/C-v-qX8 L: L: '" begin 8 ; 8 ... 8 8 end s[v,k+2] : = 3-arctan(sXzeta) Block: V:= Q>Y;\Z L: L: '" begin D;D; .. D ; 8 ; 8 ; ...8 ; 4.2.3. Semantics 8 end Assignment statements serve for assigning the value of It should be kept in mind that each of the statements S an expression to one or several variables. The process will may again be a complete compound statement or block. in the general case be understood to take place in three 4.1.2. Examples steps as follows: 4.2.3.1. Any subscript expressions occurring in the left Basic statements: part variables are evaluated in sequence from left to right. a:= p+q go to Naples 4.2.3.2. The expression of the statement is evaluated. 8TART: CONTINUE: W : = 7.993 4.2.3.3. The value of the expression is assigned to all the left part variables, with any subscript expressions Compound statement: having values as evaluated in step 4.2.3.L begin x : = 0 ; for y : = 1 step 1 until n do x : = 4.2.4. Types x+A[y] ; All variables of a left part list must be of the same if x>q then go to 8TOP else if x>w-2 then goto8 ; declared type. If the variables are Boolean, the expression Aw: 8t: W: = x-l-bob end must likewise be Boolean. If the variables are of type

306 Communications of the ACM real or integer, the expression must be arithmetic. If 4.5.3. Semantics the type of the arithmetic expression differs from that of Conditional statements cause certain statements to be the variables,. appropriate transfer functions are under­ executed or skipped depending on the running values of stood to be automatically invoked. For transfer from specified Boolean expressions. real to integer type, the transfer function is understood 4.5.3.1. If statement. The unconditional statement of to yield a result equivalent to an if statement will be executed if the Boolean expression of the if clause is true. Otherwise it will be skipped and the entier(E+O.5) operation will be continued with the next statement. where E is the value of the expression. 4.5.3.2. Conditional statement. According to the syn­ 4.3. GO TO STATEMENTS tax two different forms of conditional statements are 4.3.1. Syntax possible. These may be illustrated as follows: ifBI then 81 else if B2 then 82 else 83 ; 84 (go to statement) :: = go to (designational expression) and 4.3.2. Examples if B1 then 81 else if B2 then 82 else if B3 then 83 ; 84 go to 8 Here B1 to B3 are Boolean expressions, while S1 to S3 are go to exit [n+1] go to Town[if yO then n : = n+1 (for list element) :: = (arithmetic expression)I if v>u then V: q: = n-l-rn else go to R (arithmetic expression) step (arithmetic expression) until if ss then a: = v-q else if v>s-l (for list) :: = (for list elementjjrfor list), (for list element) then go to 8 (for clause) :: = for (variable) : = (for list) do (for statement) :: = (for clause)(statement)I follows: (label): (for statement) L3:V:=E; 4.6.2. Examples if ..,F then go to Element exhausted Statement S; for q : = 1 step s until n do A[q] : = B[q] gotoL3 ; for k := 1, VIX2 while Vl

In this picture the word initialize means: perform the first 4.7. PROCEDURE STATEMENTS assignment of the for clause. Advance means: perform the 4.7.1. Syntax next assignment of the for clause. Test determines if the (actual parameter) :: = (string)I(expression) I(array identifier)I last assignment has been done. If so, the execution con­ (switch identifier) I(procedure identifier) tinues with the successor of the for statement. If not, the (letter string) :: = (letter)I(letter string)(letter) statement following the for clause is executed. (parameter delimiter) :: = ,I(letter string):( 4.6.4. The for list elements (actual parameter list) :: = (actual parametef>I (actual parameter list)(parameter delimiter) The for list gives a rule for obtaining the values which (actual parameter) are consecutively assigned to the controlled variable. This (actual parameter part) :: = (empty)I sequence of values is obtained from the for list elements «actual parameter list» by taking these one by one in the order in which they (procedure statement):: = (procedure identifier) are written. The sequence of values generated by each of (actual parameter part) the three species of for list elements and the corresponding 4.7.2. Examples execution of the statement S are given by the following rules: Spur (A) Order: (7)Result to: (V) 4.6.4.1. Arithmetic expression. This element gives rise Transpose (W,v+l) Absmax(A,N,M,Yy,I,K) to one value, namely the value of the given arithmetic Innerproduct(A[t,P,u],B[P],lO,P,Y) expression as calculated immediately before the corre­ sponding execution' of the statement S. These examples correspond to examples given in section 4.6.4.2. Step-until-element. A for element of the form 5.4.2. A step B until C, where A, B, and C, are arithmetic expres­ 4.7.3. Semantics sions, gives rise to an execution which may be described A procedure statement serves to invoke (call for) the most concisely in terms of additional ALGOL statements execution of a procedure body (cf. section 5.4. Procedure as follows: Declarations). Where the procedure body is a statement written in ALGOL the effect of this execution will be equiva­ V:= A lent to the effect of performing the following operations Ll: if (V-C)X sign(B»O then go to Element exhausted; on the program: Statement S . 4.7.3.1. Value assignment (call by value) V:= V+.B ; go to Ll All formal parameters quoted in the value part of the procedure declaration heading are assigned the values where V is the controlled variable of the for clause and (cf. section 2.8. Values and Types) of the corresponding Element exhausted points to the evaluation according to actual parameters, these assignments being considered as the next element in the for list, or if the step-until-element being performed explicitly before entering the procedure is the last of the list, to the next statement in the program. body. These formal parameters will subsequently be 4.6.4.3. While-element. The execution governed by a treated as local to the procedure body. for list element of the form E while F, where E is an 4.7.3.2. Name replacement (call by name) arithmetic and F a Boolean expression, is most concisely Any formal parameter not quoted in the value list is described in terms of additional ALGOL statements as replaced, throughout the procedure body, by the corre-

308 Communtcatfons of the ACM sponding actual parameter, after enclosing this latter in In the procedure statement such restrictions must eVI­ parentheses wherever syntactically possible. Possible con­ dently be observed. flicts between identifiers inserted through this process and 4.7.6. Nonlocal quantities of the body other identifiers already present within the procedure A procedure statement written outside the scope of any body will be avoided by suitable systematic changes of the non-local quantity of the procedure body is undefined. formal or local identifiers involved. 4.7.7. Parameter delimiters 4.7.3.3. Body replacement and execution All parameter delimiters are understood to be equiva­ Finally the procedure body, modified as above, is lent. No correspondence between the parameter delimiters inserted in place of the procedure statement and executed. used in a procedure statement and those used in the pro­ 4.7.4. Actual-formal correspondence cedure heading is expected beyond their number being the The correspondence between the actual parameters of same. Thus the information conveyed by using the elabo­ the procedure statement and the formal parameters of the rate ones is entirely optional. procedure heading is established as follows: The actual 4.7.8. Procedure body expressed in code parameter list of the procedure statement must have the The restrictions imposed on a procedure statement same number of entries as the formal parameter list of calling a procedure having its body expressed in non­ the procedure declaration heading. The correspondence is ALGOL code evidently can only be derived from the charac­ obtained by taking the entries of these two lists in the teristics of the code used and the intent of the user and same order. thus fall outside the scope of the reference language. 4.7.5. Restrictions For a procedure statement to be defined it is evidently 5. Declarations necessary'that the operations on the procedure body de­ Declarations serve to define certain properties of the fined in sections 4.7.3.1 and 4.7.3.2 lead to a correct ALGOL identifiers of the program. A declaration for an identifier statement. is valid for one block. Outside this block the particular This imposes the restriction on any procedure statement identifier may be used for other purposes (cf. section 4.1.3). that the kind and type of each actual parameter be com­ Dynamically this implies the following: at the time of an patible with the kind and type of the corresponding formal entry into a block (through the begin, since the labels parameter. Some important particular cases of this gen­ inside are local and therefore inaccessible from outside) eral rule are the following: all identifiers declared for the block assume the signifi­ 4.7.5.1. Strings cannot occur as actual parameters in cance implied by the nature of the declarations given. procedure statements calling procedure declarations If these identifiers had already been defined by other having ALGOL 60 statements as their bodies (cf. section declarations outside they are for the time being given a 4.7.8). new significance. Identifiers which are not declared for the 4.7.5.2. A formal parameter which occurs as a left part block, on the other hand, retain their old meaning. variable in an assignment statement within the procedure At the time of an exit from a block (through end, or by body and which is not called by value can only correspond a go to statement) all identifiers which are declared for to an actual parameter which is a variable (special case of the block lose their significance again. expression]. A declaration may be marked with the additional 4.7.5.3. A formal parameter which is used within the declarator own. This has the following effect: upon a procedure body as an array identifier can only corre­ reentry into the block, the values of own quantities will spond to an actual parameter which is an array identifier be unchanged from their values at the last exit, while the of an array of the same dimensions. In addition if the values of declared variables which are not marked as own are undefined. Apart from labels and formal parameters formal parameter is called by value the local array created of procedure declarations and with the possible exception during the call will have the same. subscript bounds as of those for standard functions (cf. sections 3.2.4 and the actual array. 3.2.5), all identifiers of a program must be declared. No 4.7.5.4. A formal parameter which is called by value identifier may be declared more than once in anyone cannot in general correspond to a switch identifier or a block head. procedure identifier, because these latter do not possess Syntax. values (the exception is the procedure identifier of a pro­ cedure declaration which has an empty formal parameter (declaration) :: = (type deolarationjkarray declarationi] (switch declaration)I(procedure declaration) part (cf. section 5.4.1) and which defines the value of a function designator (cf. section 5.4.4). This procedure 5.1. TYPE DECLARATIONS identifier is in itself a complete expression). 5.1.1. Syntax 4.7.5.5. Any formal parameter may have restrictions (type list) :: = (simple variable)I on the type of the corresponding actual parameter asso­ (simple variable), (type list) (type) :: = reallinteger\Boolean ciated with it (these restrictions may, or may not, be (local or own type) :: = (typerlown (type) given through specifications in the procedure heading). (type declaration) :: = (local or own type)(type list)

Communications of the ACM 309 5.1.2. Examples 5.2.4.3. An array is defined only when the values of all integer p,q,s upper subscript bounds are not smaller than those of the own Boolean Acryl,n corresponding lower bounds. 5.2.4.4. The expressions will be evaluated once at 5.1.3. Semantics each entrance into the block. Type declarations serve to declare certain identifiers to 5.2.5. The identity of subscripted variables represent simple variables of a given type. Real declared The identity of a subscripted variable is not related to variables may only assume positive or negative values the subscript bounds given in the array declaration. How­ including zero. Integer declaredvariables may only assume ever, even if an array is declared own the values of the positive and negative integral values including zero. corresponding subscripted variables will, at any time, Boolean declared variables may only assume the values be defined only for those of these variables which have true and false. subscripts within the most recently calculated subscript In arithmetic expressions any position which can be bounds. occupied by a real declared variable may be occupied by an integer declared variable. 5.3. SWITCH DECLARATIONS For the semantics of own, see the fourth paragraph of 5.3.1. Syntax section 5 above. (switch list) :: = (designational expression)! 5.2. ARRAY DECLARATIONS (switch list),(designational expression) 5.2.1. Syntax (switch declaration) :: = switch (switch identifier): = (switch list) (lower bound) :: = (arithmetic expression) 5.3.2. Examples (upper bound) :: = (arithmetic expression) (bound pair) :: = (lower bound): (upper bound) switch 8 : = 81,82,Q[m], if v> -5 then 83 else 84 (bound pair list) :: = (bound pair)l(bound pair list),(bound pair) switch Q : = p1,w (array segment) :: = (array identifier)[(bound pair list)]I 5.3.3. Semantics (array identifier),(array segment) (array list) :: = (array segmentjj/array list),(array segment) A switch declaration defines the values corresponding (array declaration) :: = array (array list)[(local or own type) to a switch identifier. These values are given one by one array (array list) as the values of the designational expressions entered in 5.2.2. Examples the switch list. With each of these designational expres­ sions there is associated a positive integer, 1, 2, ... , ob­ array a, b, c[7:n,2:m], s[-2:10] tained by counting the items in the list from left to right. own integer array A[if c

310 Communications of the ACM (procedure heading) :: = (procedure identifier) Designators and section 4.7. Procedure Statements) (formal parameter part) ; (value part)(speciflcation part) be assigned the values of or replaced by actual parameters. (procedure body) :: = (statement)j(code) Identifiers in the procedure body which are not formal (procedure declaration) :: = procedure (procedure heading)(procedure body)I will be either local or non-local to the body depending on (type) procedure (procedure heading)(procedure body) whether they are declared within the body or not. Those of them which are nonlocal to the body may well be local 5.4.2. Examples (see also the examples at the end of to the block in the head of which the proceduredeclaration the report). appears. procedure Spur(a)Order:(n)Result:(s) value n 5.4..4. Values of function designators array a ; integer n ; real s For a procedure declaration to define the value of a begin integer k function designator there must, within the procedure body, s:= 0 ; for k : = 1 step 1 until n do s : = s + a[k,k] occur an assignment of a value to the procedure identifier, end and in addition the type of this value must be declared through the appearance of a type declarator as the very procedure Transpose(a)Order :(n) value Il first symbol of the procedure declaration. array a ; integer n ; Any other occurrence of the procedure identifier within begin real w ; integer i , k for i := 1 step 1 until n do the procedure body denotes activation of the procedure. for k : = l+i step 1 until n do 5.4.5. Specifications begin w : = a[i,k] In the heading a specification part, giving information a[i,k] : = a[k,i] about the kinds and types of the formal parameters by a[k,i] := w means of an obvious notation, may be included. In this end end Transpose part no formal parameter may occur more than once and formal parameters called by name (cf. section 4.7.3.2) integer procedure Step (u) ; real u may be omitted altogether. Step: = if O~uf\u~1 then 1 else 0 5.4.6. Code as procedure body ~ It is understood that the procedure body may be ex­ procedure Absmax(a)size :(n,m)Result:(y)Subscripts: pressed in nOn-ALGOL language. Since it is intended that (i,k) ; eornmerrt The absolute greatest element of the matrix a, the use of this feature should be entirely a question of of size n by m is transferred to y, and the sub­ hardware representation, no further rules concerning scripts of this element to i and k this code language can be given within the reference array a ; integer n, m, i, k ; real y language. begin integer p, q y:= 0 for p : = 1 step 1 until n do for q : = 1 step 1 until mdo ifabs(a[p,q]»ythenbeginy:=abs(a[p,q]) ; i:=p ; Examples of Procedure Declarations: k:=q end end Absmax EXAMPLE 1. procedure euler (fct, sum, eps, tim) ; value eps, tim procedure Innerproduct(a,b)Order:(k,p)Result :(y) integer tim ; real procedure fct ; real sum, eps value k , eommerrt euler computes the sum of fct(i) for i from zero up to integer k,p ; real y,a,b, infinity by means of a suitably refined euler transformation. The begin real s summation is stopped as soon as tim times in succession the abso­ s:= 0 ; lute value of the terms of the transformed series are found to be for p : = 1 step 1 until k do s : =s+aXb less than eps. Hence, one should provide a function fct with one y:= s integer argument, an upper bound eps, and an integer tim. The end Innerproduct output is the sum sum. euler is particularly efficient in the case of a slowly convergent or divergent alternating series ; 5.4.3. Semantics begin integer i, k, n, t ; array m[O:15] ; real mn, mp, ds A procedure declaration serves to define the procedure i : = n : = t : = 0 ; m[O]: = fct(O) sum: = m[O]/2 associated with a procedure identifier. The principal con­ nextterm: i : = i-I-I ; mn : = fct(i) stituent of a procedure declaration is a statement or a for k : = 0 step 1 until n do piece of code, the procedure body, which through the use begin mp : = (mn+m[k])/2 ; m[k] . - mn mn : = mp end means of procedure statements and/or function designators may if (abs(mn)

Comrmrrrlcat.iorrs of the ACM 311 8 EXAMPLE 2. solution at xe. Important: the parameters n, FKT, z enter RKlST as nonlocal entities procedure RK(x,y,n,FKT,eps,eta,xE,yE,fi) ; value x,y begin integer n ; Boolean fi ; real x,eps,eta,xE array array wll;n], a[I:5] ; integer k,j , y,yE ; procedure FKT ; a[l] : = a[2] : = a[5] : = h/2 ; a[3]: = a[4] : = h comment : RK integrates the system Yk'=h(x,Yl ,Y2,... , Yn) xe := x (k=1,2, ... ,n) of differential equations with the method of Runge­ for k : = 1 step 1 until n do ye[k] : = w[k] : = y[k] Kutta with automatic search for appropriate length of integration for j : = 1 step 1 until 4 do step. Parameters are: The initial values x and y[k] for x and the un­ begin known functions Yk (x). The order n of the system. The procedure FKT(xe,w,n,z) FKT(x,y,n,z) which represents the system to be integrated, i.e, xe : = x-l-ajj] ; the set of functions fk . The tolerance values eps and eta which for k : = 1 step 1 until n do govern the accuracy of the numerical integration. The end of the begin integration interval xE. The output parameter yE which repre­ w[k] : = y[kl+aU]Xz[kl sents the solution at x=xE. The Boolean variable fi, which must ye[k] : = ye[k] + aU+l]Xz[kl/3 always be given the value true for an isolated or first entry into end k RK. If however the functions y must be available at several mesh­ end j points "0 , xi , ... , Xn , then the procedure must be called repeat­ end RKlST edly (with X=Xk, XE=Xk+lo fork=O, 1, ... , n-l) and then the Begin of program: later calls may occur with fi=false which saves computing time. if fi then begin H : = xE-x s : = 0 end else H : = Hs The input parameters of FKT must be x.y,n, the output parameter out : = false ; z represents the set of derivatives z[k]=h(x,Yll], y[2], ... , ylnl) AA: if (x+2.01XH-xE>0)=(H>0) then for x and the actual y's. A procedure comp enters as a non-local begin Hs : = H ; out : = true H' - (xE-x)/2 identifier end if ; begin RKlST (x,y,2XH,xl,yl) array z,yl,y2,y3[I:n] ; real xl,x2,x3,H ; Boolean out BB: RKlST (x,y,H,x2,y2) ; RKlST(x2,y2,H,x3,y3) integer k,j ; own real s,Hs , for k : = 1 step 1 until n do procedure RKlST(x,y,h,xe,ye) ; real x,h,xe ; aeray if eomp (yl [k],y3[k],eta) >eps then go to CC y,ye ; comment: comp(a,b,c) is a function designator, the value comment: RKlST integrates one single RUNGE-KUTTA of which is the absolute value of the" difference of the with initial values x,y[k] which yields the output mantissae of a and b, after the exponents of these parameters xe=x+h and ye[k], the latter being the quantities have been made equal to the largest of the ex­ ponents of the originally given parameters a.b,c 8 This RK-program contains some new ideas which are related x : = x3 ; if out then go to DD to ideas of S. GILL, A process for the step-by-step integration of for k : = 1 step 1 until n do y[k] : = y3[k] differential equations in an automatic computing machine, Proc. ifs=5 then begin s : = 0 ; H: = 2XH end if Camb. Phil. Soc. Vol. 47 (1951) p. 96; and E. FROBERG, On the s : = s+1 ; go to AA ; solution of ordinary differential equations with digital com­ CC:H:=0.5XH ; out:=false ; xl:=x2 puting machines, Fysiograf. saua: Lund, FiJrhd. 20 Nr. 11 (1950) for k : = 1 step 1 until n do yl[k] : = y2[k] p. 136-152. It must be clear, however, that with respect to com­ go to BB ; puting time and round-off errors it may not be optimal, nor has it DD: for k : = 1 step 1 until n do yE[k] : = y3[k] actually been tested on a computer. end RK

ALPHABETIC INDEX OF DEFINITIONS OF CONCEPTS AND SYNTACTIC UNITS All references are given through section numbers. The references are given in three groups: def Following the abbreviation "def", reference to the syntactic definition (if any) is given. synt Following the abbreviation "synt", references to the occurrences in metalinguistic formulae are given. References already quoted in the def-group are not repeated. text Following the word "text", the references to definitions given in the text are given. The basic symbols represented by signs other than underlined words have been collected at the beginning. The examples have been ignored in compiling the index.

+, see: plus [0, see: ten see: minus ., see: colon X, see: multiply " see: see: divide I, +, := , see: colon equal i, see: exponentiation jji, see: space <, ~, =, ~, >, rf, see: (relational operator) =, :;), V, A, -', see: (logical operator) ( ), see: parentheses " see: comma [ ], see: subscript bracket ., see: decimal point , " see: string quote

312 Communications of the ACM (actual parameter), def 3.2.1,4.7.1 (for list element), def 4.6.1 text 4.6.4.1,4.6.4.2,4.6.4.3 (actual parameter list), def 3.2.1,4.7.1 (formal parameter), def 5.4.1 text 5.4.3 (actual parameter part), def 3.2.1, 4.7.1 (formal parameter list), def 5.4.1 (adding operator), def 3.3.1 (formal parameter part), def 5.4.1 alphabet, text 2.1 (for statement), def 4.6.1 synt 4.1.1, 4.5.1 text 4.6 (complete sec­ arithmetic, text 3.3.6 tion) (arithmetic expression), def 3.3.1 synt 3, 3.1.1, 3.3.1, 3.4.1, 4.2.1, (function designator), def 3.2.1 synt 3.3.1, 3.4.1 text 3.2.3,5.4.4 4.6.1, 5.2.1 text 3.3.3 (arithmetic operator), def 2.3 text 3.3.4 go to, synt 2.3, 4.3.1 array, synt 2.3, 5.2.1, 5.4.1 (go to statement), def 4.3.1 synt 4.1.1 text 43.3 array, text 3.1.4.1 (array declaration), clef5.2.1 synt 5 text 5.2.3 (identifier), def 2.4.1 synt 3.1.1, 3.2.1, 3.5.1, 5.4.1 text 2.4.3 (array identifier), def 3.1.1 synt 3.2.1, 4.7.1, 5.2.1 text 2.8 (identifier list), def 5.4.1 (array list), def 5.2.1 if, synt 2.3, 3.3.1, 4.5.1 (array segment), def 5.2.1 (if.clause), def 3.3.1, 4.5.1 synt 3.4.1, 3.5.1 text 3.3.3, 4.5.3.2 (assignment statement), def 4.2.1 synt 4.1.1 text 1,4.2.3 (if statement), def 4.5.1 text 4.5.3.1 (implication), def 3.4.1 (basic statement), def 4.1.1 synt 4.5.1 integer, synt 2.3,5.1.1 text 5.1.3 (basic symbol), def 2 (integer), def 2.5.1 text 2.5.4 begin, synt 2.3, 4.1.1 (block), def 4.1.1 synt 4.5.1 text 1,4.1.3,5 label, synt 2.3, 5.4.1 (block head), def 4.1.1 (label), def 3.5.1 synt 4.1.1, 4.5.1, 4.6.1 text 1 4.1.3 Boolean, synt 2.3, 5.1.1 text 5.1.3 (left part), def 4.2.1 (Boolean expression), def 3.4.1 synt 3,3.3.1,4.2.1,4.5.1,4.6.1 text (left part list), def 4.2.1 3.4.3 (letter), def 2.1 synt 2, 2.4.1, 3.2.1, 4.7.1 (Boolean factor), def 3.4.1 (letter string), def 3.2.1, 4.7.1 (Boolean primary), def 3.4.1 local, text 4.1.3 (Boolean secondary), def 3.4.1 (localor own type), def 5.1.1 synt 5.2.1 (Boolean term), def 3.4.1 (logical operator), def 2.3 synt 3.4.1 text 3.4.5 (bound pair), def 5.2.1 (logical value), def 2.2.2 synt 2, 3.4.1 (bound pair list), def 5.2.1 (lower bound), def 5.2.1 text 5.2.4 (bracket), def 2.3 minus -, synt 2.3, 2.5.1, 3.3.1 text 3.3.4.1 (code), synt 5.4.1 text 4.7.8,5.4.6 multiply X, synt 2.3, 3.3.1 text 3.3.4.1 colon:, synt 2.3, 3.2.1, 4.1.1, 4.5.1, 4.6.1, 4.7.1,5.2.1 (multiplying operator), def 3.3.1 colon equal :=, synt 2.3, 4.2.1, 4.6.1, 5.3.1 comma, , synt 2.3, 3.1.1, 3.2.1, 4.6.1, 4.7.1, 5.1.1, 5.2.1, 5.3.1, nonlocal, text 4.1.3 5.4.1 (number), def 2.5.1 text 2.5.3, 2.5.4 comment, synt 2.3 comment convention, text 2.3 (open string), def 2.6.1 (compound statement), def 4.11 synt 4.5.1 text 1 (operator), def 2.3 (compound tail), def 4.1.1 own, synt 2.3,5.1.1 text 5, 5.2.5 (conditional statement), def 4.5.1 synt 4.1.1 text 4.5.3 (parameter delimiter), def 3.2.1, 4.7.1 synt 5.4.1 text 4.7.7 (decimal fraction), def 2.5.1 parentheses ( ), synt 2.3, 3.2.1, 3.3.1, 3.4.1, 3.5.1, 4.7.1,5.4.1 text (decimal number), def 2.5.1 text 2.5.3 3.3.5.2 decimal point. , synt 2.3, 2.5.1 plus + ,synt 2.3, 2.5.1, 3.3.1 text 3.3.4.1 (declaration), def 5 synt 4.1.1 text 1, 5 (complete section) (primary), def 3.3.1 (declarator), def 2.3 procedure, synt 2.3, 5.4.1 (delimiter), def 2.3 synt 2 (procedure body), def 5.4.1 (designational expression), def 3.5.1 synt 3, 4.3.1, 5.3.1 text 3.5.3 (procedure declaration), def 5.4.1 synt 5 text 5.4.3 (digit), def 2.2.1 synt 2, 2.4.1, 2.5.1 (procedure heading), def 5.4.1 text 5.4.3 dimension, text 5.2.3.2 (procedure identifier) def 3.2.1 synt 3.2.1, 4.7.1, 5.4.1 text 4.7.5.4 divide / +, synt 2.3, 3.3.1 text 3.3.4.2 (procedure statement), def 4.7.1 synt 4.1.1 text 4.7.3 do, synt 2.3, 4.6.1 program, text 1 (dummy statement), def 4.4.1 synt 4.1.1 text 4.4.3 (proper string), def 2.6.1

else, synt 2.3,3.3.1,3.4.1,3.5.1,4.5.1 text 4.5.3.2 quantity, text 2.7 (empty), def 1.1 synt 2.6.1, 3.2.1, 4.4.1, 4.7.1,5.4.1 end, synt 2.3, 4.1.1 real, synt 2.3,5.1.1 text 5.1.3 entier, text 3.2.5 (relation), def 3.4.1 text 3.4.5 exponentiation j, synt 2.3, 3.3.1 text 3.3.4.3 (relational operator), def 2.3, 3.4.1 (exponent part), def 2.5.1 text 2.5.3 (expression), def 3 synt3.2.1, 4.7.1 text 3 (complete section) scope, text 2.7 semicolon; , synt 2.3, 4.1.1, 5.4.1 (factor), def 3.3.1 (separator), def 2.3 false, synt 2.2.2 (sequential operator), def 2.3 for, synt 2.3, 4.6.1 (simple arithmetic expression), def 3.il.! text 3.3.3 (for clause), def 4.6.1 text 4.6.3, (simple Boolean), def 3.4.1 (for list), def 4.6.1 text 4.6.4 (simple designational expression), def 3.5.1

Communications of the ACM 313 (simple variable), def 3.1.1 synt 5.1.1 text 2.4.3 (term), def 3.3.1 space iii ,synt 2.3 text 2.3, 2.6.3 ten 10 , synt 2.3, 2.5.1 (specification part), def 5.4.1 text 5.4.5 then, synt 2.3, 3.3.1, 4.5.1 (specificator), def 2.3 transfer function, text 3.2.5 (specifier), def 5.4.1 true, synt 2.2.2 standard function, text 3.2.4, 3.2.5 (type), def 5.1.1 synt 5.4.1 text 2.8 (statement), def 4.1.1, synt 4.5.1, 4.6.1, 5.4.1 text 4 (complete sec- (type declaration), def 5.1.1 synt 5 text 5.1.3 tion) (type list), def 5.1.1 statement bracket, see: begin end step, synt 2.3, 4.6.1 text 4.6.4.2 (unconditional statement), def 4.1.1, 4.5.1 string, synt 2.3, 5.4.1 (unlabelled basic statement), def 4.1.1 (string), def 2.6.1 synt 3.2.1, 4.7.1 text 2.6.3 (unlabelled block), def 4.1.1 string quotes' " synt 2.3, 2.6.1, text 2.6.3 (unlabelled compound), def 4.1.1 subscript, text 3.1.4.1 (unsigned integer), def 2.5.1,3.5.1 subscript bound, text 5.2.3.1 (unsigned number), def 2.5.1 synt 3.3.1 subscript bracket [ ], synt 2.3, 3.1.1, 3.5.1, 5.2.1 until, synt 2.3, 4.6.1 text 4.6.4.2 (subscripted variable), def 3.1.1 text 3.1.4.1 (upper bound), def 5.2.1 text 5.2.4 (subscript expression), def 3.1.1 synt 3.5.1 (subscript list), def 3.1.1 value, synt 2.3, 5.4.1 successor, text 4 value, text 2.8, 3.3.3 switch, synt 2.3, 5.3.1, 5.4.1 (value part), def 5.4.1 text 4.7.3.1 (switch declaration), def 5.3.1 synt 5 text 5.3.3 (variable), def 3.1.1 synt 3.3.1, 3.4.1, 4.2.1, 4.6.1 text 3.1.3 (switch designator), def 3.5.1 text 3.5.3 (variable identifier), def 3.1.1 (switch identifier), def 3.5.1 synt 3.2.1, 4.7.1, 5.3.1 (switch list), def 5.3.1 while, synt 2.3, 4.6.1 text 46.4.3

END OF THE REPORT

314 Communications of the ACM