|
|
Appendix 1. Modula-2 syntaxThe syntax of the Modula-2 language is described using Extended Backus Naur-Formalism (EBNF) notation.
Example The rule: ident = letter {letter | digit} can be read as: an identifier is a sequence of letters and numbers that starts with a letter.
compilation module =
program module | definition module | implementation module ;
program module =
"MODULE", module identifier, [interrupt protection], semicolon,
import lists,
module block, module identifier, period ;
module identifier =
identifier ;
definition module =
"DEFINITION", "MODULE", module identifier, semicolon,
import lists, definitions,
"END", module identifier, period ;
implementation module =
"IMPLEMENTATION", "MODULE", module identifier,
[interrupt protection], semicolon,
import lists,
module block, module identifier, period ;
interrupt protection =
left bracket, protection expression, right bracket ;
protection expression =
constant expression ;
module block =
declarations, [module body], "END" ;
module body =
initialization body, [finalization body] ;
initialization body =
"BEGIN", block body ;
finalization body =
"FINALLY", block body ;
block body =
normal part, ["EXCEPT", exceptional part ] ;
normal part =
statement sequence ;
exceptional part =
statement sequence ;
import lists =
{ import list } ;
import list =
simple import | unqualified import ;
simple import =
"IMPORT", identifier list, semicolon ;
unqualified import =
"FROM", module identifier, "IMPORT", identifier list, semicolon ;
export list =
unqualified export | qualified export ;
unqualified export =
"EXPORT", identifier list, semicolon ;
qualified export =
"EXPORT", "QUALIFIED", identifier list, semicolon ;
qualified identifier =
{ qualifying identifier, period }, identifier ;
qualifying identifier =
module identifier ;
definitions =
{ definition } ;
definition =
"CONST", { constant declaration, semicolon } |
"TYPE", { type definition, semicolon } |
"VAR", { variable declaration, semicolon } |
procedure heading, semicolon ;
procedure heading =
proper procedure heading | function procedure heading ;
type definition =
type declaration | opaque type definition ;
opaque type definition =
identifier ;
declarations =
{ declaration } ;
declaration =
"CONST", { constant declaration, semicolon } |
"TYPE", { type declaration, semicolon } |
"VAR", { variable declaration, semicolon } |
procedure declaration, semicolon |
local module declaration, semicolon ;
constant declaration =
identifier, equals, constant expression ;
type declaration =
identifier, equals, type denoter ;
variable declaration =
variable identifier list, colon, type denoter ;
variable identifier list =
identifier, [ machine address], { comma, identifier, [machine address] } ;
machine address =
left bracket, value of address type, right bracket ;
value of address type =
constant expression ;
procedure declaration =
proper procedure declaration | function procedure declaration ;
proper procedure declaration =
proper procedure heading, semicolon,
( proper procedure block, procedure identifier | "FORWARD" ) ;
procedure identifier =
identifier ;
proper procedure heading =
"PROCEDURE", procedure identifier, [formal parameters] ;
formal parameters =
left parenthesis, [formal parameter list], right parenthesis ;
formal parameter list =
formal parameter, { semicolon, formal parameter } ;
proper procedure block =
declarations, [procedure body], "END" ;
procedure body =
"BEGIN", block body ;
function procedure declaration =
function procedure heading, semicolon,
( function procedure block, procedure identifier | "FORWARD" ) ;
function procedure heading =
"PROCEDURE", procedure identifier, formal parameters,
colon, function result type ;
function result type =
type identifier ;
function procedure block =
declarations, function body, "END" ;
function body =
"BEGIN", block body ;
formal parameter =
value parameter specification | variable parameter specification ;
value parameter specification =
identifier list, colon, formal type ;
variable parameter specification =
"VAR", identifier list, colon, formal type ;
local module declaration =
"MODULE", module identifier, [interrupt protection], semicolon,
import lists,
[export list],
module block, module identifier ;
type denoter =
type identifier | new type ;
ordinal type denoter =
ordinal type identifier | new ordinal type ;
type identifier =
qualified identifier ;
ordinal type identifier =
type identifier ;
new type =
new ordinal type |
set type |
packedset type |
pointer type |
procedure type |
array type |
record type ;
new ordinal type =
enumeration type | subrange type ;
enumeration type =
left parenthesis, identifier list, right parenthesis ;
identifier list =
identifier, { comma, identifier } ;
subrange type =
[range type], left bracket, constant expression, ellipsis,
constant expression, right bracket ;
range type =
ordinal type identifier ;
set type =
"SET", "OF", base type ;
base type =
ordinal type denoter ;
packedset type =
"PACKEDSET", "OF", base type ;
pointer type =
"POINTER", "TO", bound type ;
bound type =
type denoter ;
procedure type =
proper procedure type | function procedure type ;
proper procedure type =
"PROCEDURE",
[left parenthesis, [formal parameter type list], right parenthesis] ;
function procedure type =
"PROCEDURE", left parenthesis, [formal parameter type list],
right parenthesis, colon, function result type ;
formal parameter type list =
formal parameter type, { comma, formal parameter type } ;
formal parameter type =
variable formal type | value formal type ;
variable formal type =
"VAR", formal type ;
value formal type =
formal type ;
formal type =
type identifier | open array formal type ;
open array formal type =
"ARRAY", "OF", open array component type ;
open array component type =
formal type ;
array type =
"ARRAY", index type, { comma, index type }, "OF", component type ;
index type =
ordinal type denoter ;
component type =
type denoter ;
record type =
"RECORD", field list, "END" ;
field list =
fields, { semicolon, fields } ;
fields =
[fixed fields | variant fields] ;
fixed fields =
identifier list, colon, field type ;
field type =
type denoter ;
variant fields =
"CASE", tag field, "OF", variant list, "END" ;
tag field =
[tag identifier], colon, tag type ;
tag identifier =
identifier ;
tag type =
ordinal type identifier ;
variant list =
variant, { case separator, variant },
[variant else part] ;
variant else part =
"ELSE", field list ;
variant =
[variant label list, colon, field list] ;
variant label list =
variant label, { comma, variant label } ;
variant label =
constant expression, [ellipsis, constant expression] ;
statement =
empty statement |
assignment statement |
procedure call |
return statement |
retry statement |
with statement |
if statement |
case statement |
while statement |
repeat statement |
loop statement |
exit statement |
for statement ;
statement sequence =
statement, { semicolon, statement } ;
empty statement =
;
assignment statement =
variable designator, assignment operator, expression ;
procedure call =
procedure designator, [actual parameters] ;
procedure designator =
value designator ;
actual parameters =
left parenthesis, [actual parameter list], right parenthesis ;
actual parameter list =
actual parameter, { comma, actual parameter } ;
actual parameter =
variable designator | expression | type parameter ;
type parameter =
type identifier ;
return statement =
simple return statement | function return statement ;
simple return statement =
"RETURN" ;
function return statement =
"RETURN", expression ;
retry statement =
"RETRY" ;
with statement =
"WITH", record designator, "DO", statement sequence, "END" ;
record designator =
variable designator | value designator ;
if statement =
guarded statements, [if else part], "END" ;
guarded statements =
"IF", boolean expression, "THEN", statement sequence,
{ "ELSIF", boolean expression, "THEN", statement sequence } ;
if else part =
"ELSE", statement sequence ;
boolean expression =
expression ;
case statement =
"CASE", case selector, "OF", case list, "END" ;
case selector =
ordinal expression ;
case list =
case alternative, { case separator, case alternative }, [case else part] ;
case else part =
"ELSE", statement sequence ;
case alternative =
[case label list, colon, statement sequence] ;
case label list =
case label, { comma, case label } ;
case label =
constant expression, [ellipsis, constant expression] ;
while statement =
"WHILE", boolean expression, "DO", statement sequence, "END" ;
repeat statement =
"REPEAT", statement sequence, "UNTIL", boolean expression ;
loop statement =
"LOOP", statement sequence, "END" ;
exit statement =
"EXIT" ;
for statement =
"FOR", control variable identifier, assignment operator, initial value,
"TO", final value,
["BY", step size],
"DO",
statement sequence, "END" ;
control variable identifier =
identifier ;
initial value =
ordinal expression ;
final value =
ordinal expression ;
step size =
constant expression ;
variable designator =
entire designator |
indexed designator |
selected designator |
dereferenced designator ;
entire designator =
qualified identifier ;
indexed designator =
array variable designator,
left bracket, index expression, { comma, index expression },
right bracket ;
array variable designator =
variable designator ;
index expression =
ordinal expression ;
selected designator =
record variable designator, period, field identifier ;
record variable designator =
variable designator ;
field identifier =
identifier ;
dereferenced designator =
pointer variable designator, dereferencing operator ;
pointer variable designator =
variable designator ;
expression =
simple expression, [relational operator, simple expression] ;
simple expression =
[sign], term, { term operator, term } ;
term =
factor, { factor operator, factor } ;
factor =
left parenthesis, expression, right parenthesis |
logical negation operator, factor |
value designator |
function call |
value constructor |
constant literal ;
relational operator =
equals operator |
inequality operator |
less than operator |
greater than operator |
less than or equal operator |
subset operator |
greater than or equal operator |
superset operator |
set membership operator ;
term operator =
plus operator |
set union operator |
minus operator |
set difference operator |
logical disjunction operator |
string catenate symbol ;
factor operator =
multiplication operator |
set intersection operator |
division operator |
symmetric set difference operator |
rem operator |
div operator |
mod operator |
logical conjunction operator ;
value designator =
entire value |
indexed value |
selected value |
dereferenced value ;
entire value =
qualified identifier ;
indexed value =
array value, left bracket,
index expression, { comma, index expression },
right bracket ;
array value =
value designator ;
selected value =
record value, period, field identifier ;
record value =
value designator ;
dereferenced value =
pointer value, dereferencing operator ;
pointer value =
value designator ;
function call =
function designator, actual parameters ;
function designator =
value designator ;
value constructor =
array constructor | record constructor | set constructor ;
array constructor =
array type identifier, array constructed value ;
array type identifier =
type identifier ;
array constructed value =
left brace, repeated structure component,
{ comma, repeated structure component },
right brace ;
repeated structure component =
structure component, ["BY", repetition factor] ;
repetition factor =
constant expression ;
structure component =
expression |
array constructed value |
record constructed value |
set constructed value ;
record constructor =
record type identifier, record constructed value ;
record type identifier =
type identifier ;
record constructed value =
left brace,
[structure component, { comma, structure component }],
right brace ;
set constructor =
set type identifier, set constructed value ;
set type identifier =
type identifier ;
set constructed value =
left brace, [member, { comma, member }], right brace ;
member =
interval | singleton ;
interval =
ordinal expression, ellipsis, ordinal expression ;
singleton =
ordinal expression ;
constant literal =
whole number literal |
real literal |
string literal ;
ordinal expression =
expression ;
constant expression =
expression ;
Source : ISO/IEC 10514-1 |