.sp 2 .NH Deviations from the standard .nh .PP The compiler deviates from the ISO 7185 standard with respect to the following clauses: .IP "\fBISO 6.1.3:\fR" 14 \h'-5u'Identifiers may be of any length and all characters of an identifier shall be significant in distinguishing between them. .sp .in +3m The constant IDFSIZE, defined in the file \fIidfsize.h\fR, determines the (maximum) significant length of an identifier. It can be set at run time with the \-M option (see also section on compiler options). .in -3m .sp .IP "\fBISO 6.1.8:\fR" \h'-5u'There shall be at least one separator between any pair of consecutive tokens made up of identifiers, word-symbols, labels or unsigned-numbers. .sp .in +3m A token separator is not needed when a number is followed by an identifier or a word-symbol. For example the input sequence, 2\fBthen\fR, is recognized as the integer 2 followed by the keyword \fBthen\fR. .in -3m .sp .IP "\fBISO 6.2.1:\fR" \h'-29u'The label-declaration-part shall specify all labels that prefix a statement in the corresponding statement-part. .sp .ti +3m The compiler generates a warning if a label is declared but never defined. .bp .IP "\fBISO 6.2.2:\fR" \h'-9u'The scope of identifiers and labels should start at the beginning of the block in which these identifiers or labels are declared. .sp .in +3m The compiler, as most other one pass compilers deviates in this respect, because the scope of variables and labels start at their defining-point. .nf .in +4m \fBprogram\fR deviates\fB; const\fR x \fB=\fR 3\fB; procedure\fR p\fB; const\fR y \fB=\fR x\fB;\fR x \fB=\fR true\fB; begin end; begin end.\fR .in -4m .fi In procedure p, the constant y has the integer value 3. This program does not conform to the standard. In [SAL] a simple algorithm is described for enforcing the scope rules, it involves numbering all scopes encoutered in the program in order of their opening, and recording in each identifier table entry the number of the latest scope in which it is used. Note: The compiler does not deviate from the standard in the following program: .nf .in +4m \fBprogram\fR conforms\fB; type\fR x \fB=\fR real\fB; procedure\fR p\fB; type\fR y \fB= ^\fRx\fB;\fR x \fB=\fR boolean\fB; var\fR p \fB:\fR y\fB; begin end; begin end.\fR .in -4m .fi In procedure p, the variable p is a pointer to boolean. .fi .in -3m .sp .IP "\fBISO 6.4.3.2:\fR" The standard specifies that any ordinal type is allowed as index-type. .sp .in +3m The required type \fIinteger\fR is not allowed as index-type, i.e. .ti +2m \fBARRAY [ \fIinteger\fB ] OF\fR is not permitted. .br This could be implemented, but this might cause problems on machines with a small memory. .in -3m .sp .IP "\fBISO 6.4.3.3:\fR" \h'-1u'The type possessed by the variant-selector, called the tag-type, must be an ordinal type, so the integer type is permitted. The values denoted by all case-constants shall be distinct and the set thereof shall be equal to the set of values specified by the tag-type. .sp .in +3m Because it is impracticable to enumerate all integers as case-constants, the integer type is not permitted as tag-type. It would not make a great difference to allow it as tagtype. .in -3m .sp .IP "\fBISO 6.8.3.9:\fR" The standard specifies that the control-variable of a for-statement is not allowed to be modified while executing the loop. .sp .in +3m Violation of this rule is not detected. An algorithm to implement this rule can be found in [PCV].