[comp.lang.modula2] diff3 pim2 pim3 pim4

neitzel@infbs.UUCP (Martin Neitzel) (06/24/89)

The following is a three-way-diff comparing all three editions at once.
The "diff3" command numbers the input files '1', '2', and '3'.  These
numbers are referring to PIM2, PIM3, and PIM4 respectively.


====3
1:99,100c
2:99,100c
  denotes the character with the given (octal) ordinal number (and is of
  type CHAR, see 6.1).
3:99,100c
  denotes the character with the given (octal) ordinal number and is of
  type CHAR (see 6.1), i.e. is a character constant.
====1
1:132,133c
  A single-character string is of type CHAR, a string consisting of n > 1 
  characters is of type (see 6.4)
2:132c
3:132c
  A string consisting of n characters is of type (see 6.4)
====3
1:135c
2:134c
  	ARRAY [0..n-1] OF CHAR
3:134c
  	ARRAY [0..n] OF CHAR
====1
1:144c
  identifiers.  The symbols # and <> are synonyms, and so are & and AND.
2:143,144c
3:143,144c
  identifiers.  The symbols # and <> are synonyms, and so are &, AND,
  and ~, NOT.
====1
1:204c
  are separated by a period.
2:204c
3:204c
  are separated by a period.  Standard identifiers appear below.
====1
1:208c
  The following are standard identifiers:
2:208,222c
3:208,222c
  	ABS		(10.2)		INCL		(10.2)
  	BITSET		(6.6)		INTEGER		(6.1)
  	BOOLEAN		(6.1)		LONGINT		(6.1)
  	CAP		(10.2)		LONGREAL	(6.1)
  	CARDINAL	(6.1)		MAX		(10.2)
  	CHAR		(6.1)		MIN		(10.2)
  	CHR		(10.2)		NIL		(6.7)
  	DEC		(10.2)		ODD		(10.2)
  	EXCL		(10.2)		ORD		(10.2)
  	FALSE		(6.1)		PROC		(6.8)
  	FLOAT		(10.2)		REAL		(6.1)
  	HALT		(10.2)		SIZE		(10.2)
  	HIGH		(10.2)		TRUE		(6.1)
  	INC		(10.2)		TRUNC		(10.2)
  					VAL		(10.2)
====1
1:210,225c
  			
  			
  	ABS		(10.2)		HIGH		(10.2)
  	BITSET		(6.6)		INC		(10.2)
  	BOOLEAN		(6.1)		INCL		(10.2)
  	CAP		(10.2)		INTEGER		(6.1)
  	CARDINAL	(6.1)		NEW		(10.2)
  	CHAR		(6.1)		NIL		(6.7)
  	CHR		(10.2)		ODD		(10.2)
  	DEC		(10.2)		ORD		(10.2)
  	DISPOSE		(10.2)		PROC		(6.8)
  	EXCL		(10.2)		REAL		(6.1)
  	FALSE		(6.1)		TRUE		(6.1)
  	FLOAT		(10.2)		TRUNC		(10.2)
  	HALT		(10.2)		VAL		(10.2)
  
2:223a
3:223a
====1
1:232,241c
  $	ConstExpression = SimpleConstExpr [relation SimpleConstExpr].
  $	relation = "=" | "#" | "<>" | "<" | "<=" | ">" | ">=" | IN.
  $	SimpleConstExpr = ["+"|"-"] ConstTerm {AddOperator ConstTerm}.
  $	AddOperator = "+" | "-" | OR.
  $	ConstTerm = ConstFactor {MulOperator ConstFactor}.
  $	MulOperator = "*" | "/" | DIV | MOD | AND | "&".
  $	ConstFactor = qualident | number | string | set |
  $		"(" ConstExpression ")" | NOT ConstFactor.
  $	set = [qualident] "{" [element {"," element}] "}".
  $	element = ConstExpression [".." ConstExpression].
2:230c
3:230c
  $	ConstExpression = expression.
====1
1:243,245c
  The meaning of operators is explained in Chapter 8.  The identifier
  preceding the left brace of a set specifies the type of the set.  If
  it is omitted, the standard type BITSET is assumed (see 6.6).
2:232,234c
3:232,234c
  A constant expression is an expression which can be evaluated by a
  mere textual scan without actually executing the program.  Its
  operands are constants.  (see Ch.8).
====1
1:251a
2:241c
3:241c
  	bound	= MAX (INTEGER) - N
====1
1:284,285c
  1. A variable of type INTEGER assumes as values the integers between
     MinInt and MaxInt.
2:274,275c
3:274,275c
  1. INTEGER comprises the integers between MIN(INTEGER) and
     MAX(INTEGER).
====1
1:287,288c
  2. A variable of type CARDINAL assumes as values the integers between
     0 and MaxCard.
2:277c
3:277c
  2. CARDINAL comprises the integers between 0 and MAX(CARDINAL).
====1
1:290,291c
  3. A variable of type BOOLEAN assumes the truth values TRUE or FALSE.
     These are the only values of this type.
2:279c
3:279c
  3. BOOLEAN comprises the truth values TRUE or FALSE.
====1
1:293,294c
  4. A variable of type CHAR assumes as elements values the character
     set provided by the used computer system.
2:281c
3:281c
  4. CHAR denotes the character set provided by the used computer system.
====1
1:296c
  5. A variable of type REAL assumes as values real numbers.
2:283c
3:283c
  5. REAL (and LONGREAL) denote finite sets of real numbers.
====1
1:298,299c
  For implementations on 16-bit computers, MinInt = -32678, MaxInt =
  32767, and MaxCard = 65535.
2:285,286c
3:285,286c
  6. LONGINT comprises the integers between MIN(LONGINT) and
     MAX(LONGINT).
====1
1:327c
  $	SubrangeType = "[" ConstExpression ".."	ConstExpression "]".
2:314c
3:314c
  $	SubrangeType = [ident] "[" ConstExpression ".." ConstExpression "]".
====1
1:335,336c
  If the lower bound is a non-negative integer, the base type of the
  subrange is taken to be CARDINAL;
2:322,324c
3:322,324c
  The base type can be specified by an identifier preceding the bounds.
  If it is omitted, and if the lower bound is a non-negative integer,
  the base type of the subrange is taken to be CARDINAL;
====1
1:401c
  $		CASE [ident ":"] qualident OF variant { "|" variant }
2:389c
3:389c
  $		CASE [ident] ":" qualident OF variant { "|" variant }
====1
1:403c
  $	variant = CaseLabelList ":" FieldListSequence.
2:391c
3:391c
  $	variant = [CaseLabelList ":" FieldListSequence].
====1
1:458,459c
  to T.  A pointer value is generated by a call to the standard
  procedure NEW (see 10.2).
2:446,447c
3:446,447c
  to T.  A pointer value is generated by a call to an allocation
  procedure in a storage management module.
====1
1:511c
  	t:	TreePtr
2:498a
3:498a
====3
1:564,567c
2:551,554c
  four classes of operators.  The operator NOT has the highest
  precedence, followed by the so-called multiplying operators, then the
  so-called adding operators, and finally, with lowest precedence, the
  relational operators.  Sequences of operators of the same precedence
3:551,554c
  four classes of operators.  The operator NOT has the highest prcits
  execution, i.e. for the "returned" value.  The (types of these) actual
  parameters must correspond to the formal parameters as specified in
  the procedure's declaration (see operators of the same precedence
====1
1:570a
2:558c
3:558c
  $	relation = "=" | "#" | "<" | "<=" | ">" | ">=" | IN.
====1
1:571a
2:560c
3:560c
  $	AddOperator = "+" | "-" | OR.
====1
1:572a
2:562c
3:562c
  $	MulOperator = "*" | "/" | DIV | MOD | AND.
====1
1:574a
2:565,566c
3:565,566c
  $	set = [qualident] "{" [element {"," element}] "}".
  $	element = expression [".." expression].
====1
1:609,611c
  	x MOD y is equal to the remainder of the division x DIV y (for
  		y>0)
  	x = (x DIV y) * y + (x MOD y)
2:601,602c
3:601,602c
  	x MOD y is equal to the remainder of the division x DIV y
  	x = (x DIV y) * y + (x MOD y), 0 <= (x MOD y) < y
====3
1:717,718c
2:708,709c
  A string of length n1 can be assigned to a string variable of length
  n2 > n1.
3:708,709c
  A string of length n1 can be assigned to a array variable with n2 > n1
  elements of type CHAR.
====1
1:719a
2:711c
3:711c
  A string of length 1 is compatible with the type CHAR.
====2
1:751,752c
2:743,744c
  types of corresponding actual and formal parameters must be identical
  in the case of variable parameters, or assignment compatible in the
3:743,744c
  types of corresponding actual and formal parameters must be compatible
  in the case of variable parameters and assignment compatible in the
====1
1:809c
  $	case = CaseLabelList ":" StatementSequence.
2:801c
3:801c
  $	case = [CaseLabelList ":" StatementSequence].
====1
1:881c
  assignment compatible with v; C must be a constant of type INTEGER or
2:873c
3:873c
  compatible with v; C must be a constant of type INTEGER or
====1
1:1029,1030c
  In the case of variable parameters it must be compatible with its
  corresponding actual parameter (see 9.2),
2:1021,1022c
3:1021,1022c
  In the case of variable parameters it must be identical with its
  corresponding actual parameter (see 9.2, and 12. for exceptions);
====3
1:1105c
2:1097c
  	FLOAT(x)	x of type CARDINAL represented as a value of
3:1097c
  	FLOAT(x)	x of type INTEGER represented as a value of
====1
1:1109a
2:1102,1105c
3:1102,1105c
  	MAX(T)		the maximum value of type T.
  
  	MIN(T)		the minimum value of type T.
  
====
1:1116a
2:1113,1116c
  	SIZE(T)		the number of storage units required by a
  			variable of type T, or the number of storage
  			units required by the variable T.
  
3:1113,1115c
  	SIZE(T)		the number of storage units required by a
  			variable of type T.
  
====3
1:1118c
2:1118c
  			(of type CARDINAL).
3:1117c
  			(of type INTEGER).
====1
1:1137,1139c
  NEW and DISPOSE are translated into calls to ALLOCATE and DEALLOCATE,
  procedures that are either explicitly programmed or imported from
  another module.
2:1136a
3:1135a
====1
1:1141,1150c
  	NEW(p)			= ALLOCATE(p,TSIZE(T))
  	DISPOSE(p)		= DEALLOCATE(p,TSIZE(T))
  	NEW(p,t1,t2,...)	= ALLOCATE(p,TSIZE(T,t1,t2,...))
  	DISPOSE(p,t1,t2,...)	= DEALLOCATE(p,TSIZE(T,t1,t2,...))
  
  TSIZE is defined in Chapter 12, and p is declared as "VAR p: POINTER
  TO T".  These procedures must be compatible with the type
  
  	PROCEDURE(VAR ADDRESS, CARDINAL)
  
2:1137a
3:1136a
====3
1:1166a
2:1153a
3:1153c
  The module identifier is repeated at the end of the declaration.
====3
1:1174c
2:1161c
  The module identifier is repeated at the end of the declaration.
3:1160a
====1
1:1202,1203c
  If a module identifier is exported, then all identifiers occurring in
  that module's export list are also exported.
2:1188a
3:1187a
====1
1:1205,1208c
  Standard identifiers are always imported automatically.  As a
  consequence, standard identifiers can be declared in procedures only,
  but not in modules, including the compilation unit (see Ch. 14).
  
2:1189a
3:1188a
====3
1:1273c
2:1254c
          VAR i: CARDINAL;
3:1253c
          VAR i: INTEGER;
====3
1:1280c
2:1261c
       	 VAR i,j: CARDINAL; found: BOOLEAN;
3:1260c
       	 VAR i,j: INTEGER; found: BOOLEAN;
====3
1:1292c
2:1273c
  	PROCEDURE ReturnTrack (k: CARDINAL);
3:1272c
  	PROCEDURE ReturnTrack (k: INTEGER);
====1
1:1321,1323c
  The module SYSTEM exports the types WORD, ADDRESS, PROCESS, and the
  procedures ADR, SIZE, TSIZE, NEWPROCESS, TRANSFER, and possibly other
  identifiers depending on the implementation being used (see Ch. 13).
2:1302,1305c
3:1301,1304c
  The facilities exported from the module SYSTEM are specified by
  individual implementations.  Normally, the types WORD and ADDRESS, and
  the procedures ADR, TSIZE, NEWPROCESS, TRANSFER, are among them (see
  also Ch. 13).
====1
1:1330c
  This includes the types CARDINAL, INTEGER, BITSET, and all pointers.
2:1311a
3:1310a
====1
1:1342a
2:1324,1326c
3:1323,1325c
  If a formal parameter is of type ADDRESS, the corresponding actual
  parameter may be of any pointer type, even if the formal parameter is
  a VAR parameter.
====1
1:1353c
  	 BEGIN a := lastused; INC (lastused,n)
2:1337c
3:1336c
  	 BEGIN a := lastused; lastused := lastused+n
====1
1:1360,1363c
  is of type ADDRESS.  SIZE(x) denotes the number of storage units
  assigned to the variable x.  TSIZE(T) is the number od storage units
  assigned to any variable of type T.  SIZE and TSIZE are of type
  CARDINAL.
2:1344,1346c
3:1343,1345c
  is of type ADDRESS.  TSIZE(T) is the number od storage units assigned
  to any variable of type T.  TSIZE is of an arithmetic type depending
  on the implementation.
====3
1:1365,1368c
2:1348,1351c
  Examples:
  
  	ADR(lastused)  TSIZE(Node)
  
3:1346a
====1
1:1376c
  The second facility is used in variable declarations.
2:1359,1360c
3:1354,1355c
  The second, non-standard facility may be provided in variable
  declarations.
====2
1:1385c
2:1368a
3:1364c
  For examples, refer to 13.2.
====1
1:1404c
  	    A: ADDRESS; n: CARDINAL; VAR p1:PROCESS)
2:1387c
3:1383c
  	    A: ADDRESS; n: CARDINAL; VAR p1:ADDRESS)
====1
1:1417c
  	PROCEDURE TRANSFER (VAR p1, p2:PROCESS)
2:1400c
3:1396c
  	PROCEDURE TRANSFER (VAR p1, p2:ADDRESS)
====
1:1422,1423c
  procedures, as well as the type PROCESS, must be imported from the
  module SYSTEM.
2:1405c
  procedures must be imported.
3:1401c
  procedures must be imported from the module SYSTEM.
====1
1:1443c
  	PROCEDURE IOTRANSFER (VAR p1, p2: PROCESS; va: CARDINAL)
2:1425c
3:1421c
  	PROCEDURE IOTRANSFER (VAR p1, p2: ADDRESS; va: CARDINAL)
====2
1:1450,1451c
2:1432,1433c
  device.  The procedure IOTRANSFER must be imported, and should be
  considered as PDP-11 implementation-specific.
3:1428,1429c
  device.  The procedure IOTRANSFER must be imported from the module
  SYSTEM, and should be considered as PDP-11 implementation-specific.
====1
1:1467,1469c
  The following example (programmed for the PDP-11) shows a module with
  a process that acts as a driver for a typewriter.  The module contains
  a buffer B for N characters.
2:1448a
3:1444a
====1
1:1471,1510c
  	MODULE Typewriter [4]; (* typewriter interrupt priority = 4 *)
  	  FROM SYSTEM IMPORT
  	    PROCESS, NEWPROCESS, TRANSFER, IOTRANSFER, LISTEN,
  	    WORD, ADR, SIZE;
  	  EXPORT typeout;
  
  	  CONST N = 32;
  	  VAR n: INTEGER; (* no. of chars in buffer *)
  	    in, out: [1..N];
  	    B: ARRAY [1..N] OF CHAR;
  	    PRO: PROCESS; (* producer *)
  	    CON: PROCESS; (* consumer = typewriter driver *)
  	    wsp: ARRAY [1..50] OF WORD;
  	    TWS [177564B]: BITSET; (* status register *)
  	    TWB [177566B]: CHAR; (* buffer register *)
  
  	  PROCEDURE typeout (ch: CHAR);
  	  BEGIN INC(n);
  	    WHILE n>N DO LISTEN END;
  	    B[in] := ch; in := in MOD N + 1;
  	    IF n=0 THEN TRANSFER(PRO,CON) END
  	  END typeout;
  
  	  PROCEDURE driver;
  	  BEGIN
  	    LOOP DEC(n);
  	      IF n<0 THEN TRANSFER(CON,PRO) END;
  	      TWB := B[out]; out := out MOD n + 1;
  	      TWS := {6}; IOTRANSFER(CON,PRO,64B); TWS := {}
  	    END
  	  END driver;
  
  	BEGIN n:=0; in:=1; out:=1;
  	  NEWPROCESS(driver, ADR(wsp), SIZE(wsp), CON);
  	  TRANSFER (PRO,CON)
  	END Typewriter
  
  LISTEN must be a procedure that lowers the processor's priority level
  so that pending interrupts may be accepted.
  
2:1449a
3:1445a
====1
1:1527c
  contains the export list, constant, type, and variable declarations,
2:1466c
3:1462c
  contains constant, type, and variable declarations,
====1
1:1535,1536c
  $	DefinitionModule = DEFINITION MODULE ident ";" {import} 
  $		[export] {definition} END ident ".".
2:1474,1475c
3:1470,1471c
  $	DefinitionModule = DEFINITION MODULE ident ";"
  $		{import} {definition} END ident ".".
====1
1:1546,1547c
  definition/implementation module pair on one side and its clients on
  the other side.
2:1485,1489c
3:1481,1485c
  implementation module on one side and its clients on the other side.
  The definition module contains those declarations which are relevant
  to the client modules, and presumably no other ones.  Hence, the
  definition module acts as the implementation module's (extended)
  export list, and all its declared objects are exported.
====1
1:1549c
  Definition modules require the use of qualified export.  Type
2:1491c
3:1487c
  Definition modules imply the use of qualified export.  Type
====
1:1559c
  pointers and to subranges of standard types.
2:1501,1508c
  pointers.
  Assignment and test for equality are applicable to all opaque types.
  
  As in local modules, the body of an implementation module acts as an
  initialization facility for its local objects.  Before its execution,
  the imported modules are initialized in the order in which they are
  listed.  If circular references occur among modules, their order of
  initialization is not defined.
3:1497,1504c
  pointers and to subranges of standard types.
  Assignment and test for equality are applicable to all opaque types.
  
  As in local modules, the body of an implementation module acts as an
  initialization facility for its local objects.  Before its execution,
  the imported modules are initialized in the order in which they are
  listed.  If circular references occur among modules, their order of
  initialization is not defined.