270 lines
13 KiB
Plaintext
270 lines
13 KiB
Plaintext
|
.sp 1.5i
|
||
|
.LP
|
||
|
.vs 14
|
||
|
.nh
|
||
|
.ft B
|
||
|
Appendix A: ISO-PASCAL grammar
|
||
|
.ft R
|
||
|
|
||
|
|
||
|
\fBA.1 Lexical tokens\fR
|
||
|
|
||
|
The syntax 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 A.2.
|
||
|
|
||
|
The lexical tokens used to construct Pascal programs shall be 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
|
||
|
shall be insignificant in that occurrence to the meaning of the program.
|
||
|
|
||
|
letter = \fBa\fR | \fBb\fR | \fBc\fR | \fBd\fR | \fBe\fR | \fBf\fR | \fBg\fR | \fBh\fR | \fBi\fR | \fBj\fR | \fBk\fR | \fBl\fR | \fBm\fR | \fBn\fR | \fBo\fR | \fBp\fR | \fBq\fR | \fBr\fR | \fBs\fR | \fBt\fR | \fBu\fR | \fBv\fR | \fBw\fR | \fBx\fR | \fBy\fR | \fBz\fR .
|
||
|
|
||
|
digit = \fB0\fR | \fB1\fR | \fB2\fR | \fB3\fR | \fB4\fR | \fB5\fR | \fB6\fR | \fB7\fR | \fB8\fR | \fB9\fR .
|
||
|
|
||
|
|
||
|
The special symbols are tokens having special meanings and shall be used to
|
||
|
delimit the syntactic units of the language.
|
||
|
|
||
|
special-symbol = \fB+\fR | \fB\-\fR | \fB*\fR | \fB/\fR | \fB=\fR | \fB<\fR | \fB>\fR | \fB[\fR | \fB]\fR | \fB.\fR | \fB,\fR | \fB:\fR | \fB;\fR | \fB^\fR | \fB(\fR | \fB)\fR | \fB<>\fR | \fB<=\fR | \fB>=\fR | \fB:=\fR | \fB..\fR |
|
||
|
\h'\w'special-symbol = 'u'word-symbol .
|
||
|
|
||
|
word-symbol = \fBand\fR | \fBarray\fR | \fBbegin\fR | \fBcase\fR | \fBconst\fR | \fBdiv\fR | \fBdo\fR | \fBdownto\fR | \fBelse\fR | \fBend\fR | \fBfile\fR | \fBfor\fR | \fBfunction\fR |
|
||
|
\h'\w'word-symbol = 'u'\fBgoto\fR | \fBif\fR | \fBin\fR | \fBlabel\fR | \fBmod\fR | \fBnil\fR | \fBnot\fR | \fBof\fR | \fBor\fR | \fBpacked\fR | \fBprocedure\fR | \fBprogram\fR | \fBrecord\fR |
|
||
|
\h'\w'word-symbol = 'u'\fBrepeat\fR | \fBset\fR | \fBthen\fR | \fBto\fR | \fBtype\fR | \fBuntil\fR | \fBvar\fR | \fBwhile\fR | \fBwith\fR .
|
||
|
|
||
|
|
||
|
Identifiers may be of any length. All characters of an identifier shall be
|
||
|
significant. No identifier shall have the same spelling as any word-symbol.
|
||
|
|
||
|
identifier = letter { letter | digit } .
|
||
|
|
||
|
|
||
|
A directive shall only occur in a procedure-declaration or function-declaration.
|
||
|
No directive shall have the same spelling as any word-symbol.
|
||
|
|
||
|
directive = letter {letter | digit} .
|
||
|
|
||
|
|
||
|
Numbers are given in decimal notation.
|
||
|
|
||
|
.nf
|
||
|
unsigned-integer = digit-sequence .
|
||
|
unsigned-real = unsigned-integer \fB.\fR fractional-part [ \fBe\fR scale-factor ] | unsigned-integer \fBe\fR scale-factor .
|
||
|
digit-sequence = digit {digit} .
|
||
|
fractional-part = digit-sequence .
|
||
|
scale-factor = signed-integer .
|
||
|
signed-integer = [sign] unsigned-integer .
|
||
|
sign = \fB+\fR | \fB\-\fR .
|
||
|
.fi
|
||
|
|
||
|
.bp
|
||
|
Labels shall be digit-sequences and shall be distinguished by their apparent
|
||
|
integral values and shall be in the closed interval 0 to 9999.
|
||
|
|
||
|
label = digit-sequence .
|
||
|
|
||
|
|
||
|
A character-string containing a single string-element shall denote a value of
|
||
|
the required char-type. Each string-character shall denote an implementation-
|
||
|
defined value of the required char-type.
|
||
|
|
||
|
.nf
|
||
|
character-string = \fB'\fR string-element { string-element } \fB'\fR .
|
||
|
string-element = apostrophe-image | string-character .
|
||
|
apostrophe-image = \fB''\fR .
|
||
|
string-character = All 7-bits ASCII characters except linefeed (10), vertical tab (11), and new page (12).
|
||
|
.fi
|
||
|
|
||
|
|
||
|
The construct:
|
||
|
|
||
|
\fB{\fR any-sequence-of-characters-and-separations-of-lines- not-containing-right-brace \fB}\fR
|
||
|
|
||
|
shall be a comment if the "{" does not occur within a character-string or
|
||
|
within a comment. The substitution of a space for a comment shall not alter
|
||
|
the meaning of a program.
|
||
|
|
||
|
Comments, spaces (except in character-strings), and the separation of
|
||
|
consecutive lines shall be considered to be token separators. Zero or more
|
||
|
token separators may occur between any two consecutive tokens, or before
|
||
|
the first token of a program text. No separators shall occur within tokens.
|
||
|
.bp
|
||
|
.po
|
||
|
\fBA.2 Grammar\fR
|
||
|
|
||
|
The non-terminal symbol \fIprogram\fR is the start symbol of the grammar.
|
||
|
|
||
|
.nf
|
||
|
actual-parameter : expression | variable-access | procedure-identifier | function-identifier .
|
||
|
actual-parameter-list : \fB(\fR actual-parameter { \fB,\fR actual-parameter } \fB)\fR .
|
||
|
adding-operator : \fB+\fR | \fB\-\fR | \fBor\fR .
|
||
|
array-type : \fBarray\fR \fB[\fR index-type { \fB,\fR index-type } \fB]\fR \fBof\fR component-type .
|
||
|
array-variable : variable-access .
|
||
|
assignment-statement : ( variable-access | function-identifier ) \fB:=\fR expression .
|
||
|
|
||
|
base-type : ordinal-type .
|
||
|
block : label-declaration-part constant-definition-part type-definition-part variable-declaration-part
|
||
|
\h'\w'block : 'u'procedure-and-function-declaration-part statement-part .
|
||
|
Boolean-expression : expression .
|
||
|
bound-identifier : identifier .
|
||
|
buffer-variable : file-variable \fB^\fR .
|
||
|
|
||
|
case-constant : constant .
|
||
|
case-constant-list : case-constant { \fB,\fR case-constant } .
|
||
|
case-index : expression .
|
||
|
case-list-element : case-constant-list \fB:\fR statement .
|
||
|
case-statement : \fBcase\fR case-index \fBof\fR case-list-element { \fB;\fR case-list-element } [ \fB;\fR ] \fBend\fR .
|
||
|
component-type : type-denoter .
|
||
|
component-variable : indexed-variable | field-designator .
|
||
|
compound-statement : \fBbegin\fR statement-sequence \fBend\fR .
|
||
|
conditional-statement : if-statement | case-statement .
|
||
|
conformant-array-parameter-specification : value-conformant-array-specification |
|
||
|
\h'+18.5m'variable-conformant-array-specification .
|
||
|
conformant-array-schema : packed-conformant-array-schema | unpacked-conformant-array-schema .
|
||
|
constant : [ sign ] ( unsigned-number | constant-identifier ) | character-string .
|
||
|
constant-definition : identifier \fB=\fR constant .
|
||
|
constant-definition-part : [ \fBconst\fR constant-definition \fB;\fR { constant-definition \fB;\fR } ] .
|
||
|
constant-identifier : identifier .
|
||
|
control-variable : entire-variable .
|
||
|
|
||
|
domain-type : type-identifier .
|
||
|
|
||
|
else-part : \fBelse\fR statement .
|
||
|
empty-statement : .
|
||
|
entire-variable : variable-identifier .
|
||
|
enumerated-type : \fB(\fR identifier-list \fB)\fR .
|
||
|
expression : simple-expression [ relational-operator simple-expression ] .
|
||
|
.bp
|
||
|
.po
|
||
|
factor : variable-access | unsigned-constant | bound-identifier | function-designator | set-constructor |
|
||
|
\h'\w'factor : 'u'\fB(\fR expression \fB)\fR | \fBnot\fR factor .
|
||
|
field-designator : record-variable \fB.\fR field-specifier | field-designator-identifier .
|
||
|
field-designator-identifier : identifier .
|
||
|
field-identifier : identifier .
|
||
|
field-list : [ ( fixed-part [ \fB;\fR variant-part ] | variant-part ) [ \fB;\fR ] ] .
|
||
|
field-specifier : field-identifier .
|
||
|
file-type : \fBfile\fR \fBof\fR component-type .
|
||
|
file-variable : variable-access .
|
||
|
final-value : expression .
|
||
|
fixed-part : record-section { \fB;\fR record-section } .
|
||
|
for-statement : \fBfor\fR control-variable \fB:=\fR initial-value ( \fBto\fR | \fBdownto\fR ) final-value \fBdo\fR statement .
|
||
|
formal-parameter-list : \fB(\fR formal-parameter-section { \fB;\fR formal-parameter-section } \fB)\fR .
|
||
|
formal-parameter-section : value-parameter-specification | variable-parameter-specification |
|
||
|
\h'\w'formal-parameter-section : 'u'procedural-parameter-specification | functional-parameter-specification |
|
||
|
\h'\w'formal-parameter-section : 'u'conformant-array-parameter-specification .
|
||
|
function-block : block .
|
||
|
function-declaration : function-heading \fB;\fR directive | function-identification \fB;\fR function-block |
|
||
|
\h'\w'function-declaration : 'u'function-heading \fB;\fR function-block .
|
||
|
function-designator : function-identifier [ actual-parameter-list ] .
|
||
|
function-heading : \fBfunction\fR identifier [ formal-parameter-list ] \fB:\fR result-type .
|
||
|
function-identification : \fBfunction\fR function-identifier .
|
||
|
function-identifier : identifier .
|
||
|
functional-parameter-specification : function-heading .
|
||
|
|
||
|
goto-statement : \fBgoto\fR label .
|
||
|
|
||
|
identified-variable : pointer-variable \fB^\fR .
|
||
|
identifier-list : identifier { \fB,\fR identifier } .
|
||
|
if-statement : \fBif\fR Boolean-expression \fBthen\fR statement [ else-part ] .
|
||
|
index-expression : expression .
|
||
|
index-type : ordinal-type .
|
||
|
index-type-specification : identifier \fB..\fR identifier \fB:\fR ordinal-type-identifier .
|
||
|
indexed-variable : array-variable \fB[\fR index-expression { \fB,\fR index-expression } \fB]\fR .
|
||
|
initial-value : expression .
|
||
|
|
||
|
label : digit-sequence .
|
||
|
label-declaration-part : [ \fBlabel\fR label { \fB,\fR label } \fB;\fR ] .
|
||
|
|
||
|
member-designator : expression [ \fB..\fR expression ] .
|
||
|
multiplying-operator : \fB*\fR | \fB/\fR | \fBdiv\fR | \fBmod\fR | \fBand\fR .
|
||
|
.bp
|
||
|
.po
|
||
|
new-ordinal-type : enumerated-type | subrange-type .
|
||
|
new-pointer-type : \fB^\fR domain-type .
|
||
|
new-structured-type : [ \fBpacked\fR ] unpacked-structured-type .
|
||
|
new-type : new-ordinal-type | new-structured-type | new-pointer-type .
|
||
|
|
||
|
ordinal-type : new-ordinal-type | ordinal-type-identifier .
|
||
|
ordinal-type-identifier : type-identifier .
|
||
|
|
||
|
packed-conformant-array-schema : \fBpacked\fR \fBarray\fR \fB[\fR index-type-specification \fB]\fR \fBof\fR type-identifier .
|
||
|
pointer-type-identifier : type-identifier .
|
||
|
pointer-variable : variable-access .
|
||
|
procedural-parameter-specification : procedure-heading .
|
||
|
procedure-and-function-declaration-part : { ( procedure-declaration | function-declaration ) \fB;\fR } .
|
||
|
procedure-block : block .
|
||
|
procedure-declaration : procedure-heading \fB;\fR directive | procedure-identification \fB;\fR procedure-block |
|
||
|
\h'\w'procedure-declaration : 'u'procedure-heading \fB;\fR procedure-block .
|
||
|
procedure-heading : \fBprocedure\fR identifier [ formal-parameter-list ] .
|
||
|
procedure-identification : \fBprocedure \fR procedure-identifier .
|
||
|
procedure-identifier : identifier .
|
||
|
procedure-statement : procedure-identifier ( [ actual-parameter-list ] | read-parameter-list | readln-parameter-list |
|
||
|
\h'\w'procedure-statement : procedure-identifier ( ['u'write-parameter-list | writeln-parameter-list ) .
|
||
|
program : program-heading \fB;\fR program-block \fB.\fR .
|
||
|
program-block : block .
|
||
|
program-heading : \fBprogram\fR identifier [ \fB(\fR program-parameters \fB)\fR ] .
|
||
|
program-parameters : identifier-list .
|
||
|
|
||
|
read-parameter-list : \fB(\fR [ file-variable \fB,\fR ] variable-access { \fB,\fR variable-access } \fB)\fR .
|
||
|
readln-parameter-list : [ \fB(\fR ( file-variable | variable-access ) { \fB,\fR variable-access } \fB)\fR ] .
|
||
|
record-section : identifier-list \fB:\fR type-denoter .
|
||
|
record-type : \fBrecord\fR field-list \fBend\fR .
|
||
|
record-variable : variable-access .
|
||
|
record-variable-list : record-variable { \fB,\fR record-variable } .
|
||
|
relational-operator : \fB=\fR | \fB<>\fR | \fB<\fR | \fB>\fR | \fB<=\fR | \fB>=\fR | \fBin\fR .
|
||
|
repeat-statement : \fBrepeat\fR statement-sequence \fBuntil\fR Boolean-expression .
|
||
|
repetitive-statement : repeat-statement | while-statement | for-statement .
|
||
|
result-type : simple-type-identifier | pointer-type-identifier .
|
||
|
|
||
|
set-constructor : \fB[\fR [ member-designator { \fB,\fR member-designator } ] \fB]\fR .
|
||
|
set-type : \fBset\fR \fBof\fR base-type .
|
||
|
sign : \fB+\fR | \fB\-\fR .
|
||
|
simple-expression : [ sign ] term { adding-operator term } .
|
||
|
simple-statement : empty-statement | assignment-statement | procedure-statement | goto-statement .
|
||
|
simple-type-identifier : type-identifier .
|
||
|
.bp
|
||
|
.po
|
||
|
statement : [ label \fB:\fR ] ( simple-statement | structured-statement ) .
|
||
|
statement-part : compound-statement .
|
||
|
statement-sequence : statement { \fB;\fR statement } .
|
||
|
structured-statement : compound-statement | conditional-statement | repetitive-statement | with-statement .
|
||
|
subrange-type : constant \fB..\fR constant .
|
||
|
|
||
|
tag-field : identifier .
|
||
|
tag-type : ordinal-type-identifier .
|
||
|
term : factor { multiplying-operator factor } .
|
||
|
type-definition : identifier \fB=\fR type-denoter .
|
||
|
type-definition-part : [ \fBtype\fR type-definition \fB;\fR { type-definition \fB;\fR } ] .
|
||
|
type-denoter : type-identifier | new-type .
|
||
|
type-identifier : identifier .
|
||
|
|
||
|
unpacked-conformant-array-schema : \fBarray\fR \fB[\fR index-type-specification { \fB;\fR index-type-specification } \fB]\fR \fBof\fR
|
||
|
\h'\w'unpacked-conformant-array-schema : 'u'( type-identifier | conformant-array-schema ) .
|
||
|
unpacked-structured-type : array-type | record-type | set-type | file-type .
|
||
|
unsigned-constant : unsigned-number | character-string | constant-identifier | \fBnil\fR .
|
||
|
unsigned-number : unsigned-integer | unsigned-real .
|
||
|
|
||
|
value-conformant-array-specification : identifier-list \fB:\fR conformant-array-schema .
|
||
|
value-parameter-specification : identifier-list \fB:\fR type-identifier .
|
||
|
variable-access : entire-variable | component-variable | identified-variable | buffer-variable .
|
||
|
variable-conformant-array-specification : \fBvar\fR identifier-list \fB:\fR conformant-array-schema .
|
||
|
variable-declaration : identifier-list \fB:\fR type-denoter .
|
||
|
variable-declaration-part : [ \fBvar\fR variable-declaration \fB;\fR { variable-declaration \fB;\fR } ] .
|
||
|
variable-identifier : identifier .
|
||
|
variable-parameter-specification : \fBvar\fR identifier-list \fB:\fR type-identifier .
|
||
|
variant : case-constant-list \fB:\fR \fB(\fR field-list \fB)\fR .
|
||
|
variant-part : \fBcase\fR variant-selector \fBof\fR variant { \fB;\fR variant } .
|
||
|
variant-selector : [ tag-field \fB:\fR ] tag-type .
|
||
|
|
||
|
while-statement : \fBwhile\fR Boolean-expression \fBdo\fR statement .
|
||
|
with-statement : \fBwith\fR record-variable-list \fBdo\fR statement .
|
||
|
write-parameter : expression [ \fB:\fR expression [ \fB:\fR expression ] ] .
|
||
|
write-parameter-list : \fB(\fR [ file-variable \fB,\fR ] write-parameter { \fB,\fR write-parameter } \fB)\fR .
|
||
|
writeln-parameter-list : [ \fB(\fR ( file-variable | write-parameter ) { \fB,\fR write-parameter } \fB)\fR ] .
|
||
|
.fi
|
||
|
.vs
|
||
|
.bp
|
||
|
.po
|