ISO 7185 Standard


This copy of the standard is unofficial, but believed to represent an accurate current copy of the ISO 7185 standard with a modified introduction. The introduction was changed, in a humorous manner, apparently to emphasise the point that this is not meant to be an official copy.

As much as possible, the formatting of the original document has been kept in this HTML document. However, the page headers and footers have been removed, and in some cases changes were required because of differences between HTML formatting principles and the original formatting.

The original copy of this document was received as a PDF (Portable Document Format) represented as direct bitmap scans of the original. This was run through an optical character recognition program which created the character codes for the text and created a "coordinated" PDF containing both the original image and the selectable text overlaid one atop the other. From this extracted text this HTML document was created. The optical character recognition is not perfect, and there may in fact be several recognition errors within this document.

The table of contents that appears next was not part of the original standard, and I have added that. Note that the way the standard is structured, the points don't always have subjects, and may have no content. I have simply placed and referenced each of the points of the document as content indexes.

The embedded indexes, where possible, have been linked to their bookmarks. Note that in one case, such a link leads nowhere in the original standard, see the reference to 6.6.4.1. This was left unlinked. It refers to a missing index in the standard:

6.6.4.1 General. The required procedures shall be ...

This existed in the ANSI/IEEE770X3.97-1983 standard, and was left out of the ISO 7185 standard. It wasn't important, but was apparently deleted without also deleting references to it.

One of the advantages of HTML formatting is color. The optional sections of the standard, dealing with conformant array parameters, was placed in red color text. This is your indication that this may or may not exist in your implementation. Note that with the red sections removed, the ISO 7185 standard is almost identical to the original ANSI/IEEE770X3.97-1983 standard, now discontinued. The color red has no particular import, it was choosen because it shows up well against the blue background.


Table of contents

Acknowledgements

Introduction

Language history

Project history

1 Scope

2 Normative reference

3 Definitions

4 Definitional conventions

5 Compliance

6 Requirements

Annex A: Collected syntax

Annex B: Cross-references

Annex C: Required identifiers

Annex D: Errors

Annex E: Implementation-defined features

Annex F: Implementation-dependent features


Pascal

ISO 7185:1990


This online copy of the unextended Pascal standard is provided only as an aid to standardization. In the case of differences between this online version and the printed version, the printed version takes precedence.

Do not modify this document. Do not include this document in another software product. You may print this document for personal use only. Do not sell this document.

Use this information only for good ; never for evil. Do not expose to fire. Do not operate heavy equipment after reading, may cause drowsiness. Do not read under the inuence of alcohol (although there have been several unconfirmed reports that alcohol actually improves the readability). The standard is written in English. If you have trouble understanding a particular section, read it again and again and again... Sit up straight. Eat your vegatables. Do not mumble.

(C)ISO/IEC 1991

Acknowledgements

The efforts are acknowledged of all those who contributed to the work of the BSI and ISO Pascal working groups, and in particular:

Tony Addyman          Harris Hall             John Reagan
Albrecht Biedl        Carsten Hammer          Mike Rees
Bob Brewer            Atholl Hay              Arthur Sale
Coen Bron             Tony Hetherington       Paula Schwartz
David Burnett-Hall    Steve Hobbs             Barry Smith
David Bustard         Mel Jackson             John Souter
Barry Byrne           Scott Jameson           Manfred Stadel
Klaus Daessler        David Jones             Bob Tennent
Richard De Morgan     David Joslin            Tom Turba
Norman Diamond        Katsuhiko Kakehi        Eiiti Wada
Bob Dietrich          Olivier Lecarme         Willem Wakker
Ken Edwards           Jim Miner               David Watt
Jacques Farre         Wes Munsil              Jim Welsh
Bill Findlay          Bill Price              Brian Wichmann

The efforts are acknowledged of all those who contributed to the work of JPC, and in particular:

Michael Alexander      Steven Hobbs           David L. Presberg
Jeffrey Allen          Albert A. Hoffman      William C. Price
Ed Barkmeyer           Robert Hutchins        Bruce Ravenal
W. Ashby Boaz          Rosa C. Hwang          David L. Reese
Jack Boudreaux         Scott Jameson          David C. Robbins
A. Winsor Brown        David Jones            Lynne Rosenthal
Jerry R. Brookshire    Steen Jurs             Tom Rudkin
Tomas M. Burger        Mel Kanner             Stephen C. Schwarm
David S. Cargo         John Kaufmann          Rick Shaw
Richard J. Cichelli    Leslie Klein           Carol Sledge
Joe Cointment          Bruce Knobe            Barry Smith
Roger Cox              Dennis Kodimer         Rudeen S. Smith
Jean Danver            Ronald E. Kole         Bill Stackhouse
Debra Deutsch          Alan A. Kortesoja      Marius Troost
Bob Dietrich           Edward Krall           Thomas N. Turba
Victor A. Folwarczny   Robert Lange Prescott  K. Turner
G. G. Gustafson        Rainer McCown          Howard Turtle
Thomas Giventer        Jim Miner              Robert Tuttle
Hellmut Golde          Eugene N. Miya         Richard C. Vile, Jr
David N. Gray          Mark Molloy            Larry B. Weber
Paul Gregory           William Neuhauser      David Weil
Michael Hagerty        Dennis Nicholson       Thomas R. Wilcox
Charles E. Haynes      Mark Overgaard         Thomas Wolfe
Christopher Henrich    Ted C. Park            Harvey Wohlwend
Steven Hiebert         Donald D. Peckham      Kenneth M. Zemrowski
Ruth Higgins           David Peercy
Charles Hill           Robert C. B. Poon

(The above list is of people acknowledged in ANSI/IEEE770X3.97-1983.)

Introduction

This International Standard provides an unambiguous and machine independent definition of the programming language Pascal. Its purpose is to facilitate portability of Pascal programs for use on a wide variety of data processing systems.

Language history

The computer programming language Pascal was designed by Professor Niklaus Wirth to satisfy two principal aims

However, it has become apparent that Pascal has attributes that go far beyond these original goals. It is now being increasingly used commercially in the writing of both system and application software. This International Standard is primarily a consequence of the growing commercial interest in Pascal and the need to promote the portability of Pascal programs between data processing systems.

In drafting this International Standard the continued stability of Pascal has been a prime objective. However, apart from changes to clarify the specification, two major changes have been introduced.

Project history

In 1977, a working group was formed within the British Standards Institution (BSI) to produce a standard for the programming language Pascal. This group produced several working drafts, the first draft for public comment being widely published early in 1979. In 1978, BSI's proposal that Pascal be added to ISO's program of work was accepted, and the ISO Pascal Working Group (then designated ISO/TC97/SC5/WG4) was formed in 1979. The Pascal standard was to be published by BSI on behalf of ISO, and this British Standard referenced by the International Standard.

In the USA, in the fall of 1978, application was made to the IEEE Standards Board by the IEEE Computer Society to authorize project 770 (Pascal). After approval, the first meeting was held in January 1979.

In December of 1978, X3J9 convened as a result of a SPARC (Standards Planning and Requirements Committee) resolution to form a US TAG (Technical Advisory Group) for the ISO Pascal standardization effort initiated by the UK. These efforts were performed under X3 project 317.

In agreement with IEEE representatives, in February of 1979, an X3 resolution combined the X3J9 and P770 committees into a single committee called the Joint X3J9/IEEE-P770 Pascal Standards Committee. (Throughout, the term JPC refers to this committee.) The first meeting as JPC was held in April 1979.

The resolution to form JPC clarified the dual function of the single joint committee to produce a dpANS and a proposed IEEE Pascal standard, identical in content.

ANSI/IEEE770X3.97-1983, American National Standard Pascal Computer Programming Language, was approved by the IEEE Standards Board on September 17, 1981, and by the American National Standards Institute on December 16, 1982. British Standard BS6192, Specification for Computer programming language Pascal, was published in 1982, and International Standard 7185 (incorporating BS6192 by reference) was approved by ISO on December 1, 1983. Differences between the ANSI and ISO standards are detailed in the Foreword of ANSI/IEEE770X3.97-1983.

In 1985, the ISO Pascal Working Group (then designated ISO/TC97/SC22/WG2, now ISO/IEC JTC1/SC22/WG2) was reconvened after a long break. An Interpretations Subgroup was formed, to interpret doubtful or ambiguous portions of the Pascal standards. As a result of the work of this subgroup, and also of the work on the Extended Pascal standard being produced by WG2 and JPC, BS6192/ISO7185 was revised and corrected during 1988/89 ; it is expected that ANSI/IEEE770X3.97-1983 will be replaced by the revised ISO 7185.

The major revisions to BS6192 :1982 to produce the new ISO 7185 are:

INTERNATIONAL STANDARD ISO/IEC 7185:1990(E)

Information technology -- Programming

languages -- Pascal

1 Scope

1.1

This International Standard specifi es the semantics and syntax of the computer programming language Pascal by specifying requirements for a processor and for a conforming program. Two levels of compliance are defined for both processors and programs.

1.2

This International Standard does not specify

2 Normative reference

The following standard contains provisions which, through reference in this text, constitute provisions of this International Standard. At the time of publication, the edition indicated was valid. All standards are subject to revision, and parties to agreements based on this International Standard are encouraged to investigate the possibility of applying the most recent edition of the standard listed below. Members of IEC and ISO maintain registers of currently valid International Standards.

ISO 646 :1983, Information processing|ISO 7-bit coded character set for information interchange.

3 Definitions

For the purposes of this International Standard, the following definitions apply.

NOTE -- To draw attention to language concepts, some terms are printed in italics on their first mention or at their defining occurrence(s) in this International Standard.

3.1 Error

A violation by a program of the requirements of this International Standard that a processor is permitted to leave undetected.

NOTES

1 If it is possible to construct a program in which the violation or non-violation of this International Standard requires knowledge of the data read by the program or the implementation defi nition of implementationde fined features, then violation of that requirement is classified as an error. Processors may report on such violations of the requirement without such knowledge, but there always remain some cases that require execution, simulated execution, or proof procedures with the required knowledge. Requirements that can be verified without such knowledge are not classified as errors.

2 Processors should attempt the detection of as many errors as possible, and to as complete a degree as possible. Permission to omit detection is provided for implementations in which the detection would be an excessive burden.

3.2 Extension

A modification to clause 6 of the requirements of this International Standard that does not invalidate any program complying with this International Standard, as defined by 5.2, except by prohibiting the use of one or more particular spellings of identifiers (see 6.1.2 and 6.1.3).

3.3 Implementation-defined

Possibly differing between processors, but defined for any particular processor.

3.4 Implementation-dependent

Possibly differing between processors and not necessarily defined for any particular processor.

3.5 Processor

A system or mechanism that accepts a program as input, prepares it for execution, and executes the process so defined with data to produce results.

NOTE -- A processor may consist of an interpreter, a compiler and run-time system, or another mechanism, together with an associated host computing machine and operating system, or another mechanism for achieving the same effect. A compiler in itself, for example, does not constitute a processor.

Table 1 -- Metalanguage symbols

Metasymbol

Meaning

=

Shall be defined to be

>

Shall have as an alternative definition

|

Alternatively

.

End of definition

[ x ]

0 or 1 instance of x

{ x }

0 or more instances of x

( x | y )

Grouping : either of x or y

'xyz'

The terminal symbol xyz

meta-identifier

A nonterminal symbol

4 Definitional conventions

The metalanguage used in this International Standard to specify the syntax of the constructs is based on Backus-Naur Form. The notation has been modified from the original to permit greater convenience of description and to allow for iterative productions to replace recursive ones. Table 1 lists the meanings of the various metasymbols. Further specification of the constructs is given by prose and, in some cases, by equivalent program fragments. Any identifier that is defined in clause 6 as a required identifier shall denote the corresponding required entity by its occurrence in such a program fragment. In all other respects, any such program fragment is bound by any pertinent requirement of this International Standard.

A meta-identifier shall be a sequence of letters and hyphens beginning with a letter.

A sequence of terminal and nonterminal symbols in a production implies the concatenation of the text that they ultimately represent. Within 6.1 this concatenation is direct ; no characters shall intervene. In all other parts of this International Standard the concatenation is in accordance with the rules set out in 6.1.

The characters required to form Pascal programs shall be those implicitly required to form the tokens and separators defined in 6.1.

Use of the words of, in, containing, and closest-containing, when expressing a relationship between terminal or nonterminal symbols, shall have the following meanings

These syntactic conventions are used in clause 6 to specify certain syntactic requirements and also the contexts within which certain semantic specifications apply.

In addition to the normal English rules for hyphenation, hyphenation is used in this International Standard to form compound words that represent meta-identifiers, semantic terms, or both. All meta-identifiers that contain more than one word are written as a unit with hyphens joining the parts. Semantic terms ending in \type" and \variable" are also written as one hyphenated unit. Semantic terms representing compound ideas are likewise written as hyphenated units, e.g., digitvalue, activation-point, assignment-compatible, and identifying-value.

NOTES are included in this International Standard only for purposes of clarification, and aid in the use of the standard. NOTES are informative only and are not a part of the International Standard.

Examples in this International Standard are equivalent to NOTES.

5 Compliance

There are two levels of compliance, level 0 and level 1. Level 0 does not include conformant-arrayparameters. Level 1 does include conformant-array-parameters.

5.1 Processors

A processor complying with the requirements of this International Standard shall

NOTE -- 2 The phrase 'be able to' is used in 5.1 to permit the implementation of a switch with which the user may control the reporting.

A processor that purports to comply, wholly or partially, with the requirements of this International Standard shall do so only in the following terms. A compliance statement shall be produced by the processor as a consequence of using the processor or shall be included in accompanying documentation. If the processor complies in all respects with the requirements of this International Standard, the compliance statement shall be

(This processor) complies with the requirements of level (number) of ISO/IEC 7185.

If the processor complies with some but not all of the requirements of this International Standard then it shall not use the above statement, but shall instead use the following compliance statement

(This processor) complies with the requirements of level (number) of ISO/IEC 7185, with the following exceptions : (followed by a reference to, or a complete list of, the requirements of the International Standard with which the processor does not comply).

In both cases the text (This processor) shall be replaced by an unambiguous name identifying the processor, and the text (number) shall be replaced by the appropriate level number.

NOTE -- 3 Processors that do not comply fully with the requirements of the International Standard are not required to give full details of their failures to comply in the compliance statement ; a brief reference to accompanying documentation that contains a complete list in sufficient detail to identify the defects is sufficient.

5.2 Programs

A program conforming with the requirements of this International Standard shall

NOTES

1 A program that complies with the requirements of this International Standard may rely on particular implementation-de fined values or features.

2 The requirements for conforming programs and compliant processors do not require that the results produced by a conforming program are always the same when processed by a compliant processor. They may be the same, or they may differ, depending on the program. A simple program to illustrate this is

6 Requirements

6.1 Lexical tokens

NOTE -- The syntax given in this subclause describes the formation of lexical tokens from characters and the separation of these tokens and therefore does not adhere to the same rules as the syntax in the rest of this International Standard.

6.1.1 General

The lexical tokens used to construct Pascal programs are classified into special-symbols, identifiers, directives, unsigned-numbers, labels, and character-strings. The representation of any letter (upper case or lower case, differences of font, etc.) occurring anywhere outside of a character-string (see 6.1.7) shall be insignificant in that occurrence to the meaning of the program.

6.1.2 Special-symbols

The special-symbols are tokens having special meanings and are used to delimit the syntactic units of the language.

6.1.3 Identifiers

Identifiers can be of any length. The spelling of an identifier shall be composed from all its constituent characters taken in textual order, without regard for the case of letters. No identifier shall have the same spelling as any word-symbol. Identifiers that are specified to be required shall have special significance (see 6.2.2.10 and 6.10).

Examples:

6.1.4 Directives

A directive shall only occur in a procedure-declaration or a function-declaration. The only directive shall be the required directive forward (see 6.6.1 and 6.6.2). No directive shall have the same spelling as any word-symbol.

NOTE -- Many processors provide, as an extension, the directive external, which is used to specify that the procedure-block or function-block corresponding to that procedure-heading or function-heading is external to the program-block. Usually it is in a library in a form to be input to, or that has been produced by, the processor.

6.1.5 Numbers

An unsigned-integer shall denote in decimal notation a value of integer-type (see 6.4.2.2). An unsigned-real shall denote in decimal notation a value of real-type (see 6.4.2.2). The letter 'e' preceding a scale-factor shall mean times ten to the power of. The value denoted by an unsignedinteger shall be in the closed interval 0 to maxint (see 6.4.2.2 and 6.7.2.2).

Examples:

6.1.6 Labels

Labels shall be digit-sequences and shall be distinguished by their apparent integral values and shall be in the closed interval 0 to 9999. The spelling of a label shall be its apparent integral value.

6.1.7 Character-strings

A character-string containing a single string-element shall denote a value of the required char-type (see 6.4.2.2). A character-string containing more than one string-element shall denote a value of a string-type (see 6.4.3.2) with the same number of components as the character-string contains string-elements. All character-strings with a given number of components shall possess the same string-type.

There shall be an implementation-defined one-to-one correspondence between the set of alternatives from which string-elements are drawn and a subset of the values of the required char-type. The occurrence of a string-element in a character-string shall denote the occurrence of the corresponding value of char-type.

NOTE -- Conventionally, the apostrophe-image is regarded as a substitute for the apostrophe character, which cannot be a string-character.

Examples:

6.1.8 Token separators

Where a commentary shall be any sequence of characters and separations of lines, containing neither } nor *), the construct

( '{' | '(*' ) commentary ( '*)' | '}' )

shall be a comment if neither the { nor the (* occurs within a character-string or within a commentary.

NOTES

1 A comment may thus commence with { and end with *), or commence with (* and end with }.

2 The sequence (*) cannot occur in a commentary even though the sequence {) can.

Comments, spaces (except in character-strings), and the separations of consecutive lines shall be considered to be token separators. Zero or more token separators can occur between any two consecutive tokens, before the first token of a program text, or after the last token of the program text. There shall be at least one separator between any pair of consecutive tokens made up of identifiers, word-symbols, labels or unsigned-numbers. No separators shall occur within tokens.

6.1.9 Lexical alternatives

The representation for lexical tokens and separators given in 6.1.1 to 6.1.8, except for the character sequences (* and *), shall constitute a reference representation for these tokens and separators.

To facilitate the use of Pascal on processors that do not support the reference representation, the following alternatives have been defined. All processors that have the required characters in their character set shall provide both the reference representations and the alternative representations, and the corresponding tokens or separators shall not be distinguished. Provision of the reference representations, and of the alterative token @, shall be implementation-defined.

The alternative representations for the tokens shall be

Reference token Alternative token
        ^               @
        [               (.
        ].)

NOTE -- 1 The character ^(up arrow) that appears in some national variants of ISO 646 is regarded as identical to the character ^. In this International Standard, the character ^ has been used because of its greater visibility.

The comment-delimiting characters { and } shall be the reference representations, and (* and *) respectively shall be alternative representations (see 6.1.8).

NOTE -- 2 See also 1.2 f).

6.2 Blocks, scopes, and activations

6.2.1 Blocks

A block closest-containing a label-declaration-part in which a label occurs shall closest-contain exactly one statement in which that label occurs. The occurrence of a label in the label-declaration-part of a block shall be its defining-point for the region that is the block. Each applied occurrence of that label (see 6.2.2.8) shall be a label. Within an activation of the block, all applied occurrences of that label shall denote the corresponding program-point in the algorithm of the activation at that statement (see 6.2.3.2 b)).

The statement-part shall specify the algorithmic actions to be executed upon an activation of the block.

6.2.2 Scopes

6.2.2.1

Each identifier or label contained by the program-block shall have a defining-point.

6.2.2.2

Each defining-point shall have a region that is a part of the program text, and a scope that is a part or all of that region.

6.2.2.3

The region of each defining-point is defined elsewhere (see 6.2.1, 6.2.2.10, 6.3, 6.4.1, 6.4.2.3, 6.4.3.3, 6.5.1, 6.5.3.3, 6.6.1, 6.6.2, 6.6.3.1, 6.8.3.10, 6.10).

6.2.2.4

The scope of each defining-point shall be its region (including all regions enclosed by that region) subject to 6.2.2.5 and 6.2.2.6.

6.2.2.5

When an identifier or label has a defining-point for region A and another identifier or label having the same spelling has a defining-point for some region B enclosed by A, then region B and all regions enclosed by B shall be excluded from the scope of the defining-point for region A.

6.2.2.6

The region that is the field-specifier of a field-designator shall be excluded from the enclosing scopes.

6.2.2.7

When an identifier or label has a defining-point for a region, another identifier or label with the same spelling shall not have a defining-point for that region.

6.2.2.8

Within the scope of a defining-point of an identifier or label, each occurrence of an identifier or label having the same spelling as the identifier or label of the defining-point shall be designated an applied occurrence of the identifier or label of the defining-point, except for an occurrence that constituted the defining-point ; such an occurrence shall be designated a defining occurrence. No occurrence outside that scope shall be an applied occurrence.

NOTE -- Within the scope of a defining-point of an identifier or label, there are no applied occurrences of an identifier or label that cannot be distinguished from it and have a defining-point for a region enclosing that scope.

6.2.2.9

The defining-point of an identifier or label shall precede all applied occurrences of that identifier or label contained by the program-block with one exception, namely that an identifier can have an applied occurrence in the type-identifier of the domain-type of any new-pointer-types contained by the type-definition-part containing the defining-point of the type-identifier.

6.2.2.10

Required identifiers that denote required values, types, procedures, and functions shall be used as if their defining-points have a region enclosing the program (see 6.1.3, 6.3, 6.4.1, and 6.6.4.1).

NOTE -- The required identifiers input and output are not included, since these denote variables.

6.2.2.11

Whatever an identifier or label denotes at its defining-point shall be denoted at all applied occurrences of that identifier or label.

NOTES

1 Within syntax definitions, an applied occurrence of an identifier is qualified (e.g., type-identifier), whereas a use that constitutes a defining-point is not qualified.

2 It is intended that such qualification indicates the nature of the entity denoted by the applied occurrence: e.g., a constant-identifier denotes a constant.

6.2.3 Activations

6.2.3.1

A procedure-identifier or function-identifier having a defining-point for a region that is a block within the procedure-and-function-declaration-part of that block shall be designated local to that block.

6.2.3.2

The activation of a block shall contain

NOTE -- Each activation contains its own algorithm, program-points, variables, procedures, and functions, distinct from every other activation.

6.2.3.3

The activation of a procedure or function shall be an activation of the block of the procedure-block of the procedure or function-block of the function, respectively, and shall be designated as within

NOTE -- An activation of a block B can only be within activations of blocks containing B. Thus, an activation is not within another activation of the same block.

Within an activation, an applied occurrence of a label or variable-identifier, or of a procedure-identifier or function-identifier local to the block of the activation, shall denote the corresponding program-point, variable, procedure, or function, respectively, of that activation ; except that the function-identifier of an assignment-statement shall, within an activation of the function denoted by that function-identifier, denote the result of that activation.

6.2.3.4

A procedure-statement or function-designator contained in the algorithm of an activation and that specifies an activation of a block shall be designated the activation-point of the activation of the block.

6.2.3.5

All variables contained by an activation, except for those listed as program-parameters, and any result of an activation, shall be totally-undefined at the commencement of that activation. The algorithm, program-points, variables, procedures, and functions, if any, shall exist until the termination of the activation.

6.3 Constant-definitions

A constant-definition shall introduce an identifier to denote a value.

The occurrence of an identifier in a constant-definition of a constant-definition-part of a block shall constitute its defining-point for the region that is the block. The constant in a constant-definition shall not contain an applied occurrence of the identifier in the constant-definition. Each applied occurrence of that identifier shall be a constant-identifier and shall denote the value denoted by the constant of the constant-definition. A constant-identifier in a constant containing an occurrence of a sign shall have been defined to denote a value of real-type or of integer-type. The required constant-identifiers shall be as specified in 6.4.2.2 and 6.7.2.2.

6.4 Type-definitions

6.4.1 General

A type-definition shall introduce an identifier to denote a type. Type shall be an attribute that is possessed by every value and every variable. Each occurrence of a new-type shall denote a type that is distinct from any other new-type.

The occurrence of an identifier in a type-definition of a type-definition-part of a block shall constitute its defining-point for the region that is the block. Each applied occurrence of that identifier shall be a type-identifier and shall denote the same type as that which is denoted by the type-denoter of the type-definition. Except for applied occurrences in the domain-type of a new-pointer-type, the type-denoter shall not contain an applied occurrence of the identifier in the type-definition.

Types shall be classified as simple-types, structured-types or pointer-types. The required typeidentifiers and corresponding required types shall be as specified in 6.4.2.2 and 6.4.3.5.

A type-identifier shall be considered as a simple-type-identifier, a structured-type-identifier, or a pointer-type-identifier, according to the type that it denotes.

6.4.2 Simple-types

6.4.2.1 General

A simple-type shall determine an ordered set of values. A value of an ordinal-type shall have an integer ordinal number ; the ordering relationship between any two such values of one type shall be the same as that between their ordinal numbers. An ordinal-type-identifier shall denote an ordinal-type. A real-type-identifier shall denote the real-type.

6.4.2.2 Required simple-types

The following types shall exist

NOTE -- Operators applicable to the required simple-types are specified in 6.7.2.

6.4.2.3 Enumerated-types

The occurrence of an identifier in the identifier-list of an enumerated-type shall constitute its defining-point for the region that is the block closest-containing the enumerated-type. Each applied occurrence of the identifier shall be a constant-identifier. Within an activation of the block, all applied occurrences of that identifier shall possess the type denoted by the enumerated-type and shall denote the type's value whose ordinal number is the number of occurrences of identifiers preceding that identifier in the identifier-list.

NOTE -- Enumerated type constants are ordered by the sequence in which they are de fi ned, and they have consecutive ordinal numbers starting at zero.

Examples:

6.4.2.4 Subrange-types

A subrange-type shall include identification of the smallest and the largest value in the subrange. The first constant of a subrange-type shall specify the smallest value, and this shall be less than or equal to the largest value, which shall be specified by the second constant of the subrange-type. Both constants shall be of the same ordinal-type, and that ordinal-type shall be designated the host-type of the subrange-type.

Examples:

6.4.3 Structured-types

6.4.3.1 General

A new-structured-type shall be classified as an array-type, record-type, set-type, or file-type according to the unpacked-structured-type closest-contained by the new-structured-type. A component of a value of a structured-type shall be a value.

The occurrence of the token packed in a new-structured-type shall designate the type denoted thereby as packed. The designation of a structured-type as packed shall indicate to the processor that data-storage of values should be economized, even if this causes operations on, or accesses to components of, variables possessing the type to be less efficient in terms of space or time.

The designation of a structured-type as packed shall affect the representation in data-storage of that structured-type only; i.e., if a component is itself structured, the component's representation in data-storage shall be packed only if the type of the component is designated packed.

NOTE -- The ways in which the treatment of entities of a type is affected by whether or not the type is designated packed are specified in 6.4.3.2, 6.4.5, 6.6.3.3, 6.6.3.8, 6.6.5.4, and 6.7.1.

6.4.3.2 Array-types

An array-type shall be structured as a mapping from each value specified by its index-type to a distinct component. Each component shall have the type denoted by the type-denoter of the component-type of the array-type.

Example 1:

An array-type that specifies a sequence of two or more index-types shall be an abbreviated notation for an array-type specified to have as its index-type the first index-type in the sequence and to have a component-type that is an array-type specifying the sequence of index-types without the first indextype in the sequence and specifying the same component-type as the original specification. The component-type thus constructed shall be designated packed if and only if the original array-type is designated packed. The abbreviated form and the full form shall be equivalent.

NOTE -- 1 Each of the following two examples thus contains different ways of expressing its array-type.

Example 2:

Example 3:

Let i denote a value of the index-type ; let V i denote a value of that component of the array-type that corresponds to the value i by the structure of the array-type ; let the smallest and largest values specified by the index-type be denoted by m and n, respectively ; and let k = (ord(n)-ord(m)+1) denote the number of values specified by the index-type ; then the values of the array-type shall be the distinct k-tuples of the form

NOTE -- 2 A value of an array-type does not therefore exist unless all of its component-values are de fi ned. If the component-type has c values, then it follows that the cardinality of the set of values of the array-type is c raised to the power k.

Any type designated packed and denoted by an array-type having as its index-type a denotation of a subrange-type specifying a smallest value of 1 and a largest value of greater than 1, and having as its component-type a denotation of the char-type, shall be designated a string-type.

The correspondence of character-strings to values of string-types is obtained by relating the individual string-elements of the character-string, taken in textual order, to the components of the values of the string-type in order of increasing index.

NOTE -- 3 The values of a string-type possess additional properties which allow writing them to textfiles (see 6.9.3.6) and define their use with relational-operators (see 6.7.2.5).

6.4.3.3 Record-types

The structure and values of a record-type shall be the structure and values of the field-list of the record-type.

A field-list containing neither a fixed-part nor a variant-part shall have no components, shall define a single null value, and shall be designated empty.

The occurrence of an identifier in the identifier-list of a record-section of a fixed-part of a field-list shall constitute its defining-point as a field-identifier for the region that is the record-type closest containing the field-list and shall associate the field-identifier with a distinct component, which shall be designated a field, of the record-type and of the field-list. That component shall have the type denoted by the type-denoter of the record-section.

The field-list closest-containing a variant-part shall have a distinct component that shall have the values and structure defined by the variant-part.

Let Vi denote the value of the i-th component of a non-empty field-list having m components ; then the values of the field-list shall be distinct m-tuples of the form

NOTE -- 1 If the type of the i-th component has Fi values, then the cardinality of the set of values of the field-list is (F 1 * F 2 *... * Fm).

A tag-type shall be the type denoted by the ordinal-type-identifier of the tag-type. A case-constant shall denote the value denoted by the constant of the case-constant.

The type of each case-constant in the case-constant-list of a variant of a variant-part shall be compatible with the tag-type of the variant-selector of the variant-part. The values denoted by all case-constants of a type that is required to be compatible with a given tag-type shall be distinct and the set thereof shall be equal to the set of values specified by the tag-type. The values denoted by the case-constants of the case-constant-list of a variant shall be designated as corresponding to the variant.

With each variant-part shall be associated a type designated the selector-type possessed by the variant-part. If the variant-selector of the variant-part contains a tag-field, or if the case-constantlist of each variant of the variant-part contains only one case-constant, then the selector-type shall be denoted by the tag-type, and each variant of the variant-part shall be associated with those values specified by the selector-type denoted by the case-constants of the case-constant-list of the variant. Otherwise, the selector-type possessed by the variant-part shall be a new ordinal-type that is constructed to possess exactly one value for each variant of the variant-part, and no others, and each such variant shall be associated with a distinct value of that type.

Each variant-part shall have a component which shall be designated the selector of the variant-part, and which shall possess the selector-type of the variant-part. If the variant-selector of the variant-part contains a tag-field, then the occurrence of an identifier in the tag-field shall constitute the defining-point of the identifier as a field-identifier for the region that is the record-type closest-containing the variant-part and shall associate the field-identifier with the selector of the variant-part. The selector shall be designated a fi eld of the record-type if and only if it is associated with a field-identifier.

Each variant of a variant-part shall denote a distinct component of the variant-part ; the component shall have the values and structure of the field-list of the variant, and shall be associated with those values specified by the selector-type possessed by the variant-part associated with the variant. The value of the selector of the variant-part shall cause the associated variant and component of the variant-part to be in a state that shall be designated active.

The values of a variant-part shall be the distinct pairs

where k represents a value of the selector of the variant-part, and X k is a value of the field-list of the active variant of the variant-part.

NOTES

2 If there are n values specified by the selector-type, and if the fi eld-list of the variant associated with the i-th value has T i values, then the cardinality of the set of values of the variant-part is (T1 + T2 +... +Tn ). There is no component of a value of a variant-part corresponding to any non-active variant of the variant-part.

3 Restrictions placed on the use of fi elds of a record-variable pertaining to variant-parts are specified in 6.5.3.3, 6.6.3.3, and 6.6.5.3.

Examples:

6.4.3.4 Set-types

A set-type shall determine the set of values that is structured as the power set of the base-type of the set-type. Thus, each value of a set-type shall be a set whose members shall be unique values of the base-type.

NOTE -- 1 Operators applicable to values of set-types are specified in 6.7.2.4.

Examples:

NOTE -- 2 If the base-type of a set-type has b values, then the cardinality of the set of values is 2 raised to the power b.

For each ordinal-type T that is not a subrange-type, there shall exist both an unpacked settype designated the unpacked-canonical-set-of-T-type and a packed set-type designated the packedcanonical-set-of-T-type. If S is any subrange-type and T is its host-type, then the set of values determined by the type set of S shall be included in the sets of values determined by the unpackedcanonical-set-of-T-type and by the packed-canonical-set-of-T-type (see 6.7.1).

6.4.3.5 File-types

NOTE -- 1 A file-type describes sequences of values of the specified component-type, together with a current position in each sequence and a mode that indicates whether the sequence is being inspected or generated.

A type-denoter shall not be permissible as the component-type of a file-type if it denotes either a file-type or a structured-type having any component whose type-denoter is not permissible as the component-type of a file-type.

Examples:

A file-type shall define implicitly a type designated a sequence-type having exactly those values, which shall be designated sequences, defined by the following five rules in items a) to e).

NOTE -- 2 The notation x~y represents the concatenation of sequences x and y. The explicit representation of sequences (e.g., S(c)), of concatenation of sequences ; of the first, last, and rest selectors ; and of sequence equality is not part of the Pascal language. These notations are used to de fine fi le values, below, and the required file operations in 6.6.5.2 and 6.6.6.5.

A file-type also shall define implicitly a type designated a mode-type having exactly two values, which are designated Inspection and Generation.

NOTE -- 3 The explicit denotation of the values Inspection and Generation is not part of the Pascal language.

A file-type shall be structured as three components. Two of these components, designated f.L and f.R, shall be of the implicit sequence-type. The third component, designated f.M, shall be of the implicit mode-type.

Let f.L and f.R each be a single value of the sequence-type and let f.M be a single value of the mode-type ; then each value of the file-type shall be a distinct triple of the form

where f.R shall be the empty sequence if f.M is the value Generation. The value, f, of the file-type shall be designated empty if and only if f.L ~ f.R is the empty sequence.

NOTE -- 4 The two components, f.L and f.R, of a value of the fi le-type may be considered to represent the single sequence f.L ~ f.R together with a current position in that sequence. If f.R is non-empty, then f.R. first may be considered the current component as determined by the current position ; otherwise, the current position is the end-of- file position.

There shall be a file-type that is denoted by the required structured-type-identifier text. The structure of the type denoted by text shall define an additional sequence-type whose values shall be designated lines. A line shall be a sequence cs ~S(end-of-line), where cs is a sequence of components possessing the char-type, and end-of-line shall represent a special component-value. Any assertion in clause 6 that the end-of-line value is attributed to a variable other than a component of a sequence shall be construed as an assertion that the variable has attributed to it the char-type value space. If l is a line, then no component of l other than l.last shall be an end-of-line. There shall be an implementation-defined subset of the set of char-type values, designated characters prohibited from textfi les; the effect of causing a character in that subset to be attributed to a component of either t.L or t.R for any textfile t shall be implementation-dependent.

A line-sequence, ls, shall be either the empty sequence or the sequence l ~ ls' where l is a line and ls' is a line-sequence.

Every value t of the type denoted by text shall satisfy the following two rules:

NOTE -- 5 In rule b), cs may be considered, especially if it is non-empty, to be a partial line that is being generated. Such a partial line cannot occur during inspection of a fi le. Also, cs does not correspond to t.R, since t.R is the empty sequence if t.M = Generation.

A variable that possesses the type denoted by the required type-identifier text shall be designated a textfile.

NOTE -- 6 All required procedures and functions applicable to a variable of type file of char are applicable to text files. Additional required procedures and functions, applicable only to text fi les, are defined in 6.6.6.5 and 6.9.

6.4.4 Pointer-types

The values of a pointer-type shall consist of a single nil-value and a set of identifying-values each identifying a distinct variable possessing the domain-type of the new-pointer-type. The set of identifying-values shall be dynamic, in that the variables and the values identifying them shall be permitted to be created and destroyed during the execution of the program. Identifying-values and the variables identified by them shall be created only by the required procedure new (see 6.6.5.3).

NOTE -- 1 Since the nil-value is not an identifying-value, it does not identify a variable.

The token nil shall denote the nil-value in all pointer-types .

NOTE -- 2 The token nil does not have a single type, but assumes a suitable pointer-type to satisfy the assignment-compatibility rules, or the compatibility rules for operators, if possible.

6.4.5 Compatible types

Types T1 and T2 shall be designated compatible if any of the following four statements is true:

6.4.6 Assignment-compatibility

A value of type T2 shall be designated assignment-compatible with a type T1 if any of the following five statements is true:

At any place where the rule of assignment-compatibility is used

At any place where the rule of assignment-compatibility is used to require a value of integer-type to be assignment-compatible with a real-type, an implicit integer-to-real conversion shall be performed.

6.4.7 Example of a type-definition-part

type
 natural = 0..maxint;
 count = integer;
 range = integer;
 colour = (red, yellow, green, blue);
 sex = (male, female);
 year = 1900..1999;
 shape = (triangle, rectangle, circle);
 punchedcard = array [1..80] of char;
 charsequence = file of char;
 polar = record
               r : real;
           theta : angle
         end;
 indextype = 1..limit;
 vector = array [indextype] of real;
 
 person = ^ persondetails;
 
 persondetails = record
                  name, firstname : charsequence;
                  age : natural;
                  married : Boolean ;
                  father, child, sibling : person;
                  case s : sex of
                  male :
                   (enlisted, bearded : Boolean);
                  female :
                   (mother, programmer : Boolean)
               end;
 FileOfInteger = file of integer;

NOTE -- In the above example count, range, and integer denote the same type. The types denoted by year and natural are compatible with, but not the same as, the type denoted by range, count, and integer.

6.5 Declarations and denotations of variables

6.5.1 Variable-declarations

A variable shall be an entity to which a value can be attributed (see 6.8.2.2). Each identifier in the identifier-list of a variable-declaration shall denote a distinct variable possessing the type denoted by the type-denoter of the variable-declaration.

The occurrence of an identifier in the identifier-list of a variable-declaration of the variable-declarationpart of a block shall constitute its defining-point as a variable-identifier for the region that is the block. The structure of a variable possessing a structured-type shall be the structure of the structured-type. A use of a variable-access shall be an access, at the time of the use, to the variable thereby denoted. A variable-access, according to whether it is an entire-variable, a componentvariable, an identified-variable, or a buffer-variable, shall denote a declared variable, a component of a variable, a variable that is identified by a pointer value (see 6.4.4), or a buffer-variable, respectively.

Example of a variable-declaration-part:

var
 x, y, z, max : real;
 i, j : integer;
 k : 0..9;
 p, q, r : Boolean;
 operator : (plus, minus, times);
 a : array [0..63] of real;
 c : colour;
 f : file of char;
 hue1, hue2 : set of colour;
 p1, p2 : person;
 m, m1, m2 : array [1..10, 1..10] of real;
 coord : polar;
 pooltape : array [1..4] of FileOfInteger;
 
 date : record
          month : 1..12;
          year : integer
        end;

NOTE -- Variables occurring in examples in the remainder of this International Standard should be assumed to have been declared as specified in the above example.

6.5.2 Entire-variables

6.5.3 Component-variables

6.5.3.1 General

A component of a variable shall be a variable. A component-variable shall denote a component of a variable. A reference or an access to a component of a variable shall constitute a reference or an access, respectively, to the variable. The value, if any, of the component of a variable shall be the same component of the value, if any, of the variable.

6.5.3.2 Indexed-variables

A component of a variable possessing an array-type shall be denoted by an indexed-variable.

An array-variable shall be a variable-access that denotes a variable possessing an array-type. For an indexed-variable closest-containing a single index-expression, the value of the index-expression shall be assignment-compatible with the index-type of the array-type. The component denoted by the indexed-variable shall be the component that corresponds to the value of the index-expression by the mapping of the type possessed by the array-variable (see 6.4.3.2).

Example 1:

If the array-variable is itself an indexed-variable, an abbreviation shall be permitted. In the abbreviated form, a single comma shall replace the sequence ] [ that occurs in the full form. The abbreviated form and the full form shall be equivalent.

The order of both the evaluation of the index-expressions of, and the access to the array-variable of, an indexed-variable shall be implementation-dependent.

Example 2:

NOTE -- These two examples denote the same component-variable.

6.5.3.3 Field-designators

A field-designator either shall denote that component of the record-variable of the field-designator associated (see 6.4.3.3) with the field-identifier of the field-specifier of the field-designator or shall denote the variable denoted by the field-designator-identifier (see 6.8.3.10) of the field-designator. A record-variable shall be a variable-access that denotes a variable possessing a record-type.

The occurrence of a record-variable in a field-designator shall constitute the defining-point of the field-identifiers associated with components of the record-type possessed by the record-variable, for the region that is the field-specifier of the field-designator.

Examples:

An access to a component of a variant of a variant-part, where the selector of the variant-part is not a field, shall attribute to the selector that value associated (see 6.4.3.3) with the variant. It shall be an error unless a variant is active for the entirety of each reference and access to each component of the variant.

When a variant becomes non-active, all of its components shall become totally-undefined.

NOTE -- If the selector of a variant-part is undefined, then no variant of the variant-part is active.

6.5.4 Identified-variables

An identified-variable shall denote the variable, if any, identified by the value of the pointer-variable of the identified-variable (see 6.4.4 and 6.6.5.3) shall be accessible until the termination of the activation of the program-block or until the variable is made inaccessible (see the required procedure dispose, 6.6.5.3).

NOTE -- The accessibility of the variable also depends on the existence of a pointer-variable that has attributed to it the corresponding identifying-value.

A pointer-variable shall be a variable-access that denotes a variable possessing a pointer-type. It shall be an error if the pointer-variable of an identified-variable either denotes a nil-value or is undefined. It shall be an error to remove from the set of values of the pointer-type the identifying-value of an identified-variable (see 6.6.5.3) when a reference to the identified-variable exists.

Examples:

6.5.5 Buffer-variables

A file-variable shall be a variable-access that denotes a variable possessing a file-type. A buffervariable shall denote a variable associated with the variable denoted by the file-variable of the buffer-variable. A buffer-variable associated with a textfile shall possess the char-type; otherwise, a buffer-variable shall possess the component-type of the file-type possessed by the file-variable of the buffer-variable.

Examples:

It shall be an error to alter the value of a file-variable f when a reference to the buffer-variable ff exists. A reference or an access to a buffer-variable shall constitute a reference or an access, respectively, to the associated file-variable.

6.6 Procedure and function declarations

6.6.1 Procedure-declarations

The occurrence of a formal-parameter-list in a procedure-heading of a procedure-declaration shall define the formal-parameters of the procedure-block, if any, associated with the identifier of the procedure-heading to be those of the formal-parameter-list.

The occurrence of an identifier in the procedure-heading of a procedure-declaration shall constitute its defining-point as a procedure-identifier for the region that is the block closest-containing the procedure-declaration.

Each identifier having a defining-point as a procedure-identifier in a procedure-heading of a procedure-declaration in which the directive forward occurs shall have exactly one of its applied occurrences in a procedure-identification of a procedure-declaration, and this applied occurrence shall be closestcontained by the procedure-and-function-declaration-part closest-containing the procedure-heading.

The occurrence of a procedure-block in a procedure-declaration shall associate the procedure-block with the identifier in the procedure-heading, or with the procedure-identifier in the procedureidentification, of the procedure-declaration.

There shall be at most one procedure-block associated with a procedure-identifier.

Examples of procedure-and-function-declaration-parts:

Example 1:

NOTE --- This example is not for level 0.

Example 2:

6.6.2 Function-declarations

The occurrence of a formal-parameter-list in a function-heading of a function-declaration shall define the formal-parameters of the function-block, if any, associated with the identifier of the function-heading to be those of the formal-parameter-list. The function-block shall contain at least one assignment-statement such that the function-identifier of the assignment-statement is associated with the block (see 6.8.2.2).

The occurrence of an identifier in the function-heading of a function-declaration shall constitute its defining-point as a function-identifier associated with the result type denoted by the result-type for the region that is the block closest-containing the function-declaration.

Each identifier having a defining-point as a function-identifier in the function-heading of a function-declaration in which the directive forward occurs shall have exactly one of its applied occurrences in a function-identification of a function-declaration, and this applied occurrence shall be closestcontained by the procedure-and-function-declaration-part closest-containing the function-heading.

The occurrence of a function-block in a function-declaration shall associate the function-block with the identifier in the function-heading, or with the function-identifier in the function-identification, of the function-declaration ; the block of the function-block shall be associated with the result type that is associated with the identifier or function-identifier.

There shall be at most one function-block associated with a function-identifier.

Example of a procedure-and-function-declaration-part: