|
@@ -0,0 +1,269 @@
|
|
|
+.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
|