public class MachineSignal extends Exception{
  /**
    *  la classe radice di tutti segnali lanciati dalla Machine, sia verso
    *  l'interno che verso l'esterno.
    */
}


class MachineMessage extends MachineSignal{
  /**
    *  la classe radice di tutti segnali non d'errore, sia verso l'interno 
    *  che verso l'esterno, per segnalare l'avvenuta esecuzione di un evento
    */
}


class MachineException extends MachineSignal{
  /**
    *  la classe radice delle eccezioni lanciate dalla gerarchia Machine
    *  thrown by: StackMachine.go() 
    */
}


class HaltMessage extends MachineMessage{
  /**
    *  Tale Messaggio è quello inviato quando viene incontrata l'istruzione
    *  HALT: la macchina esce dal ciclo fetch-execute (entra nell'idle state)
    */
}

class InvalidDataReadAddressException extends MachineException{
  /**
    *  thrown by: DataVector.readDatumAt(); DataSegment.read(); StackMachine.read(),
    *             indLoad(), PUSH(); Push.exec()
    */
}


class InvalidDataWriteAddressException extends MachineException{
  /**
    *  thrown by: DataVector.writeDatumAt(); DataSegment.write(); StackMachine.write(),
    *             STORE(); Store.exec();
    */
}


class InvalidCodeReadAddressException extends MachineException{
  /**
    *  thrown by: CodeVector.readDatumAt(); DataSegment.read(); 
    *             CodeSegment.read();
    */
}


class EmptyMachineStackException extends MachineException{
  /**
    *  thrown by: IntStack.pop(); StackMachine.STORE(), ADD(), SUB(), MUL(), DIV(),
    *             AND(), OR(), IMPL(); Store.exec(), Add.exec(), Sub.exec(), Mul.exec(),
    *             Div.exec(), And.exec(), Or.exec(), Impl.exec()
    */
}


class HaltNotFoundException extends MachineException {
  /**
    *  thrown by: StackMachine.fetch()
    */
}

class NotRecognizedInstructionException extends MachineException{
  /**
    *  thrown by: NotRecognizedInstruction.exec()
    */
}




class parserIOException extends RuntimeException{
  /**
   *  potrebbe essere lanciata dal parser di lettura programma: caricaCSDS()
   */
}




/*
	NOTE:  eccezioni lanciate da Java e "convertite":
   ArrayIndexOutOfBoundsException in 
	DataSegment: .readDatumAt, .writeDatumAt, ...



*/

/*	DA FARE: 
	

*/
