| <letter> | ::= | A | B |... | Z | a |... | z |
| <digit> | ::= | 0 | 1 |... | 9 |
| <alphanumeric> | ::= | <letter> | <digit> | ' |
| <special symbol> | ::= | <basic symbol> | <operator> |
| <basic symbol> | ::= | begin | end | endof | ; | : | ( | ) | $ | :: | & | |
| if | then | else | fi | case | | ||
| of | esac | fo | with | in | ni | first | suchthat | from | do | od | | ||
| for | exitloop | leave | skip | assert | | ||
| var | const | aux | as specified | = | init | | ||
| final | unk | ? | proc | vproc | func | sel | label | | ||
| note | eton | ! | elif | elof | pform | while | > | < | . | # | | ||
| copy | alias | form | inline | pre | post | rule | | ||
| is | forward | external | specs | impl | shared | | ||
| invariant | initially | axiom | repmap | | ||
| record | enumerated | assumes | value | generator | ||
| <operator> | ::= | <binary operator> | <unary operator> |
| <binary operator> | ::= | ↑ | * | / | div | rem | + | - | < | ≤ | = | <> | ≥ | > | and | or | cand | cor | imp | |
| <assign op> | ||
| <unary operator> | ::= | + | - | not |
| <identifier> | ::= | <letter> {<alphanumeric>}* |
| <special identifier> | ::= | &start | &finish | &next | &done | &value | &subscript | &<operator> |
| <identifier list> | ::= | <identifier>,+ |
| <special literal> | ::= | <unsigned integer> | <unsigned real> | <string> | <boolean> | <radix> |
| <unsigned integer> | ::= | {<digit>}+ |
| <unsigned real> | ::= | <unsigned rational>{E<scale-factor>}# | <unsigned integer>E<scale-factor> |
| <unsigned rational> | ::= | <unsigned integer>.<unsigned integer> |
| <scale-factor> | ::= | {+|-}#<unsigned integer> |
| <string> | ::= | "<any sequence of characters with all quotes doubled>" |
| <boolean> | ::= | true | false |
| <radix> | ::= | {<alphanumeric>}+#<alphanumeric> |
| <compilation unit> | ::= | begin <block> end | <exec decl list> |
| <block> | ::= | {<exec decl list>;}# {<stmt>};+ {;}# |
| <exec decl list> | ::= | { <exec decl> };* |
| <exec decl> | ::= | <var decl> | <const decl> | <proc decl> | <form decl> | <label decl> |
| <expression> | ::= | <invocation> | <conditional expression> | <value expression> | |
| <with expression> | <first expression> | ||
| <stmt> | ::= | <expression> | <loop stmt> | <exit stmt> | <null stmt> | |
| <inner block> | <labeled stmt> | <assert stmt> | ||
| <labeled stmt> | ::= | <identifier> : <stmt> |
| <invocation> | ::= | <special literal> | <simple invocation>{<actuals>}# | (<invocation>) |
| <actuals> | ::= | ({<actual>},*) |
| <actual> | ::= | <expression> | <type description> |
| <simple invocation> | ::= | { <identifier>$ }* <identifier> | <special identifier> |
| <conditional expression> | ::= | <if expression> | <case expression> |
| <if expression> | ::= | if <expression> then <block> { elif <expression> then <block> }# { else <block> }# fi |
| <case expression> | ::= | case <expression> of <case> { elof <case> }* { else <block> }# esac |
| <case> | ::= | { <expression> },+ :: <block> |
| <value expression> | ::= | value <identifier>{:<obj type>}# of <block> fo |
| <with expression> | ::= | with <with list> in <block> ni |
| <with list> | ::= | { <identifier>:<invocation> },+ |
| <first expression> | ::= | first <template> suchthat <expression> { then <block> }# { else <block> }# fi |
| <template> | ::= | <identifier> from {<identifier>:}#<type description> | <identifier> from <invocation> |
| <loop stmt> | ::= | <simple loop> | <while stmt> | <for stmt> |
| <simple loop> | ::= | do <block> od |
| <while stmt> | ::= | while <expression> <simple loop> |
| <for stmt> | ::= | for <template> <simple loop> |
| <exit stmt> | ::= | exitloop | leave <identifier> |
| <null stmt> | ::= | skip |
| <inner block> | ::= | begin <block> end | begin <block> endof {<identifier>}# |
| <assert stmt> | ::= | assert <assertion> |
| <label decl> | ::= | label <identifier list> |
| <var decl> | ::= | <aux> var { <obj decl group>{<init fin clause>}# },+ |
| <const decl> | ::= | <aux> const {<obj decl group> {<init fin clause>}# | <const assign>},+ |
| <aux> | ::= | { aux }# |
| <obj decl group> | ::= | <identifier list> : <obj type> |
| <obj type > | ::= | <type description> | as specified |
| <init fin clause> | ::= | = <expression> | { init <stmt> }# { final <stmt> }# |
| <const assign> | ::= | <identifier list> = <expression> |
| <type description> | ::= | <simple invocation> { ( {<formal qual>},+ ) }# {<update set>}# | |
| ?<identifier> { <update set> }# | ||
| <formal qual> | ::= | <expression> | ?<identifier> { <update set> }# | { <identifier>: }# <type description> | |
| unk | ||
| <update set> | ::= | < { <identifier> | <special identifier> },+ > |
| <formals> | ::= | ( { <routine formal> | <binding> <obj formal> | <type formal> },+ ) |
| <routine formal> | ::= | <formal id list> proc <parms> | <formal id list> { vproc | func | sel } <v parms> |
| <binding> | ::= | { copy | { alias }# { const | var } }# |
| <formal id list> | ::= | <identifier list> : |
| <obj formal> | ::= | <formal id list> <type description> |
| <type formal> | ::= | <formal id list> { form | pform } { <update set> }# |
| <routine decl> | ::= | <vproc decl> | <proc decl> | <sel decl> |
| <vproc decl> | ::= | <aux> {inline}# {vproc | func} <routine id> <v parms> <pre post> <assumes> |
| { <routine body> }# | ||
| <proc decl> | ::= | <aux> {inline}# proc <routine id> <parms> <pre post> <assumes> { <routine body> }# |
| <sel decl> | ::= | <aux> {inline}# sel <routine id> <v parms> <pre post> <assumes> { <routine body> }# |
| <routine id> | ::= | <identifier> | <special identifier> |
| <parms> | ::= | { <formals> }# |
| <v parms> | ::= | { <formals> }# : <type description> |
| <pre> | ::= | { pre <assertion>; }# |
| <pre post> | ::= | <pre> { post <assertion>; }# |
| <routine body> | ::= | is <stmt> | is as specified | is forward | is external (<system specs>) |
| <form decl> | ::= | <aux> form <identifier> { <formals> }# <pre> <assumes> is <form body> |
| <form body> | ::= | { <specs> }# { <impl> }# end { <identifier> }# | <abbrev body> | forward | external |
| ( <system specs> ) | as specified | ||
| <specs> | ::= | specs { <var decl> | <other form decls> };+ |
| <impl> | ::= | impl { <shared> <var decl> | <other form decls> }; |
| <other form decls> | ::= | <routine decl> | <form decl> | <axiom>| <shared> <const decl> |
| <shared> | ::= | shared # |
| <axiom> | ::= | invariant <assertion> | initially <assertion> | axiom <assertion> | repmap |
| <assertion> | rule <identifier> <assertion> | ||
| <abbrev body> | ::= | <record type> | <enumerated type> |
| <record type> | ::= | record ( { <obj decl group> },+ ) |
| <enumerated type> | ::= | enumerated ( <identifier list> ) |
| <form decl> | ::= | <aux> generator <identifier> { <formals> }# : <type description> <pre> <assumes> |
| is <form body> | ||
| <assumes> | ::= | {assumes <form decl>},* |