| <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>},* |