BNF Definition of the XPL Language
<program>		::= <statement list> EOF
<statement list>	::= <statement>
			  | <statement list> <statement>
<statement>  		::= <basic statement>
			  | <if statement>
<basic statement>  	::= <assignment> ;
			  | <group> ;
			  | <procedure definition> ;
			  | <return statement> ;
			  | <call statement> ;
			  | <go to statement> ;
			  | <declaration statement> ;
                          | ;
			  | <label definition> <basic statement>
<if statement>       	::= <if clause> <statement> 
			  | <if clause> <true part> <statement>
			  | <label definition> <if statement>
<if clause>		::= IF <expression> THEN 
<true part>	        ::= <basic statement> ELSE
<group>                 ::= <group head> <ending>
<group head>            ::= DO ;
                          | DO <step definition> ;
                          | DO <while clause> ;
                          | DO <case selector> ;
                          | <group head> <statement>
<step definition>       ::= <variable> <replace> <expression> <iteration control>
<iteration control>     ::= TO <expression>
                          | TO <expression> BY <expression>
<while clause>	        ::= WHILE <expression>
<case selector>         ::= CASE <expression>
<procedure definition>  ::= <procedure head> <statement list> <ending>
<procedure head>        ::= <procedure name> ;
                          | <procedure name> <type> ;
                          | <procedure name> <parameter list> ;
                          | <procedure name> <parameter list> <type> ;
<procedure name>        ::=  <label definition> PROCEDURE
<parameter list>        ::= <parameter head> <identifier> )
<parameter head>        ::=  (
                          | <parameter head> <identifier> ,
<ending>                ::= END
                          | END <identifier>
                          | <label definition> <ending>
<label definition>      ::= <identifier> :
<return statement>      ::= RETURN
                          | RETURN <expression>
<call statement>        ::= CALL <variable>
<go to statement>       ::= <go to> <identifier>
<go to>                 ::= GO TO
                          | GOTO
<declaration statement> ::= DECLARE <declaration element>
		          | <declaration statement> , <declaration element>
<declaration element>   ::= <type declaration>
                          | <identifier> LITERALLY <string>
<type declaration>      ::= <identifier specification> <type>
                          | <bound head> <number> ) <type>
                          | <type declaration> <initial list>
<type>                  ::= FIXED
                          | CHARACTER
                          | LABEL
                          | <bit head> <number> )
<bit head>              ::= BIT (
<bound head>            ::= <identifier specification> (
<identifier specification> ::= <identifier>
                             | <identifier list> <identifier> )
<identifier list>          ::= (
                             | <identifier list> <identifier> ,
 
<initial list>             ::= <initial head> <constant> )
<initial head>             ::= INITIAL (
                             | <initial head> <constant> ,
<assignment>               ::= <variable> <replace> <expression>
                             | <left part> <assignment>
<replace>                  ::= =
<left part>                ::= <variable> ,
<expression>               ::= <logical factor>
                             | <expression> | <logical factor>
<logical factor>           ::= <logical secondary>
                             | <logical factor> & <logical secondary>
<logical secondary>        ::= <logical primary>
                             | ¬ <logical primary>
<logical primary>          ::= <string expression>
                             | <string expression> <relation> <string expression>
<relation>                 ::= =
                             | <
                             | >
                             | ¬ =
                             | ¬ <
                             | ¬ >
                             | < =
          		     | > =
<string expression>        ::= <arithmetic expression>
			     | <string expression> ||  <arithmetic expression>
<arithmetic expression>    ::= <term>
                             | <arithmetic expression> + <term>
                             | <arithmetic expression> - <term>
                             | + <term>
                             | - <term>
<term>                     ::= <primary>
                             | <term> * <primary>
                             | <term> / <primary>
                             | <term> MOD <primary>
<primary>         ::= <constant>
                    | <variable>
                    | ( <expression> )
<variable>        ::= <identifier>
                    | <subscript head> <expression> )
<subscript head>  ::= <identifier> (
                    | <subscript head> <expression> ,
<constant>        ::= <string>
                    | <number>
The following definitions are hardcoded into the lexical scanner:
<number>	  ::= <integer>
                    | <bit string>
<integer>         ::= <decimal digit>
                    | <integer> <decimal digit>
<decimal digit>   ::= 0|1|2|3|4|5|6|7|8|9
<bit string>      ::= "<bit list>"
<bit list>        ::= <hex integer>
		    | <bit group>
                    | <bit list> <bit group>
<bit group>       ::= (1)<binary integer>
                    | (2)<quartal integer>
                    | (3)<octal integer>
                    | (4)<hex integer>
<binary integer>  ::= <binary digit>
                    | <binary integer> <binary digit>
<binary digit>    ::= 0|1
<quartal integer> ::= <quartal digit>
                    | <quartal integer> <quartal digit>
<quartal digit>   ::= 0|1|2|3
<octal integer>   ::= <octal digit>
                    | <octal integer> <octal digit>
<octal digit>     ::= 0|1|2|3|4|5|6|7
<hex integer>     ::= <hex digit>
                    | <hex integer> <hex digit>
<hex digit>       ::= 0|1|2||3|4|5|6|7|8|9|A|B|C|D|E|F
<string>          ::= '<characters>'
                    | ''
<characters>      ::= <character>
                    | <characters> <character>
<character>       ::= ''
                    | {any EBCDIC character other than ' }
<identifier>      ::= <id character>
                    | <identifier> <id character>
                    | <identifier> <decimal digit>
<id character>    ::= <letter> | <break character>
<letter>          ::= A|B|C ... |Z|a|b|c ... |z
<decimal digit>   ::= 0|1| ... |9
<break character> ::= _ | @ | # | $
No identifier can exceed 256 characters.  The following reserved words cannot be
used as identifiers:
| BIT | DECLARE | GOTO | PROCEDURE | 
| BY | ELSE | IF | RETURN | 
| CALL | END | INITIAL | THEN | 
| CASE | EOF | LABEL | TO | 
| CHARACTER | FIXED | LITERALLY | WHILE | 
| DO | GO | MOD | 
<comment>           ::= <opening bracket> <almost anything> <closing bracket>
<opening bracket>   ::= /*
<closing bracket>   ::= */
<almost anything>   ::= {any string of valid characters which does not contain a <closing bracket>}
A $ within a comment specifies that the next <character> is a control character.
There are 256 control toggles corresponding to the 256 valid character codes.  
Each toggle can have a value true or false.  
When $<character> is encountered, the value of the corresponding toggle is complemented.  
Currently defined toggles are:
| toggle | Description | initial | 
|---|
| B | Interlist emitted byte codes in hex. | off | 
| D | Print statistics and symbol table. | on | 
| E | Interlist emitted assembly code. | off | 
| L | List compiled program. | on | 
| M | List program without auxiliary information. | off | 
| N | Warn if procedure args¬=parameters. | off | 
| S | Dump symbol table at end of each procedure. | off | 
| T | Begin tracing. |  | 
| U | Terminate tracing. |  | 
| Z | Allow program to execute in spite of errors. | off | 
| | | Set margin. Input scan will be terminated at column containing the | |  |