# args
# 0) variable name
# 1) list of lines of the stack trace

class SPFException(Exception):
    def __init__(self, *args):
        super().__init__(*args)
        self.msg = "Une erreur est survenue"
        self.errorline = None

    def __str__(self):
        return (f"[ligne {self.errorline}] " if self.errorline else "") + f"{self.msg}"

class SPFSyntaxError(SPFException):
    def __init__(self, *args):
        super().__init__(*args)
        self.msg = "Une erreur de syntaxe est survenue"

class SPFUnknownVariable(SPFException):
    def __init__(self, *args):
        super().__init__(*args)
        self.msg = f"la variable `{args[0]}` n'est pas déclarée"

class SPFUninitializedVariable(SPFException):
    def __init__(self, *args):
        super().__init__(*args)
        self.msg = f"la variable `{args[0]}` n'est pas initialisée"

class SPFAlreadyDefined(SPFException):
    def __init__(self, *args):
        super().__init__(*args)
        self.msg = f"la variable `{args[0]}` est déjà déclarée"

class SPFIncompatibleType(SPFException):
    def __init__(self, *args):
        super().__init__(*args)
        self.msg = f"`{args[0]}` n'est pas de type `{args[1]}`"

class SPFIndexError(SPFException):
    def __init__(self, *args):
        super().__init__(*args)
        self.msg = f"La liste `{args[0]}` ne posède pas d'élèment d'indexe {args[1]}"


