APPENDIX A: IMP80 Syntax
KEY
      ::=  A | B | C | D | E | F | G | H | I | J | K | L | M |
                   N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
                   a | b | c | d | e | f | g | h | i | j | k | l | m |
                   n | o | p | q | r | s | t | u | v | w | x | y | z
       ::=  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
     ::=  {newline character}
         ::=  {| character}
   ::=  ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - |
                   . | / | : | < | = | > | ? | @ | [ | ] | \ | ^ | _ |
                   ` | ~ | ; | <letter> | <digit> | <bar>
        ::=  []...
     ::=  %comment   | !  
     ::=   []...
      ::=   | 
        ::=   []...
    ::=   [, ]...
   ::=  [] 
        ::=  . []
   ::=  [] [] [@ ]
  ::=   _ ... |  ' ... '
      ::=   | 
  ::=  '  ' | M' ... '
   ::=  " []... "
       ::=   |  |  |
                   <char const> | <str const>
        ::=  + | - | \ | ~
       ::=  = | == | <- | ->
        ::=  + | -
       ::=   | -> | == | \== | ##
       ::=  = | # |  \= | <> | > | >= | < | <=
          ::=  * | / | // | + | - | ** | **** | \ | \\ | >> | << |
                   ! | !! | & | .
         ::=  (  [, ]... )
       ::=  _  []
     ::=   [] []... |  | (  )
        ::=  []  [ ]... 
       ::=  (  ) | (*)
   ::=   []
   ::=  =  [, ]...
       ::=  [[%array] %name]  |
                   %array [%format] <adecln> 
      ::=    [,  ]...
     ::=  [[%array] %name]  | %array  
 ::=  (  [%or ]... )
   ::=   [, ]...
       ::=    | 
       ::=  (  ) | 
       ::=  %integer | %real | %long %real
        ::=  %integer | %real | %long  | %byte [%integer] |
                   %short [%integer] | %half [%integer] | %string<count>
       ::=   | %record 
       ::=   [%alias "  "]
   ::=   [, ]...
     ::=   [= ]
      ::=  [[%array] %name] [%spec]  [, ]... |
                   %array [%format] [%spec] <oname> <bpair>[<constlist>]
          ::=  %fn | %function | %map