depart : modules EOF ; modules : module | modules module ; module : MODULE moduletype declarations ; moduletype : ATOM | ATOM LP neatomlist RP ; declarations : | declarations declaration ; declaration : var | define | assign ; var : VAR vlist ; vlist : | vlist term COLON type SEMI ; type : BOOLEAN | LCB neconstlist RCB | usertype ; usertype : ATOM | ATOM LP neexprlist RP ; define : DEFINE dlist ; dlist : | dlist term EQDEF expr SEMI ; assign : ASSIGN alist ; alist : | alist alhs EQDEF expr SEMI ; alhs : NEXT LP term RP | SMALLINIT LP term RP ; neconstlist : constant | neconstlist COMMA constant ; neatomlist : ATOM | neatomlist COMMA ATOM ; neexprlist : expr | neexprlist COMMA expr ; term : ATOM | term DOT ATOM ; number : NUMBER ; expr : term | number | FALSEEXP | TRUEEXP | LP expr RP | expr OR expr | expr AND expr | NOT expr | CASE caselist ESAC | expr PLUS expr | expr MINUS expr | expr TIMES expr | expr DIVIDE expr | expr MOD expr | expr EQUAL expr | expr NOTEQUAL expr | expr LT expr | expr GT expr | expr LE expr | expr GE expr | LCB neatomset RCB ; neatomset : constant | neatomset COMMA constant ; constant : ATOM | number | FALSEEXP | TRUEEXP ; caselist : | expr COLON expr SEMI caselist ;