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	
              ;

