class Token(object):
    def __init__(self, start_mark, end_mark):
        self.start_mark = start_mark
        self.end_mark = end_mark

    def __repr__(self):
        attributes = [key for key in self.__dict__ if not key.endswith("_mark")]
        attributes.sort()
        arguments = ", ".join(["%s=%r" % (key, getattr(self, key)) for key in attributes])
        return "%s(%s)" % (self.__class__.__name__, arguments)


# class BOMToken(Token):
#    id = '<byte order mark>'


class DirectiveToken(Token):
    id = "<directive>"

    def __init__(self, name, value, start_mark, end_mark):
        self.name = name
        self.value = value
        self.start_mark = start_mark
        self.end_mark = end_mark


class DocumentStartToken(Token):
    id = "<document start>"


class DocumentEndToken(Token):
    id = "<document end>"


class StreamStartToken(Token):
    id = "<stream start>"

    def __init__(self, start_mark=None, end_mark=None, encoding=None):
        self.start_mark = start_mark
        self.end_mark = end_mark
        self.encoding = encoding


class StreamEndToken(Token):
    id = "<stream end>"


class BlockSequenceStartToken(Token):
    id = "<block sequence start>"


class BlockMappingStartToken(Token):
    id = "<block mapping start>"


class BlockEndToken(Token):
    id = "<block end>"


class FlowSequenceStartToken(Token):
    id = "["


class FlowMappingStartToken(Token):
    id = "{"


class FlowSequenceEndToken(Token):
    id = "]"


class FlowMappingEndToken(Token):
    id = "}"


class KeyToken(Token):
    id = "?"


class ValueToken(Token):
    id = ":"


class BlockEntryToken(Token):
    id = "-"


class FlowEntryToken(Token):
    id = ","


class AliasToken(Token):
    id = "<alias>"

    def __init__(self, value, start_mark, end_mark):
        self.value = value
        self.start_mark = start_mark
        self.end_mark = end_mark


class AnchorToken(Token):
    id = "<anchor>"

    def __init__(self, value, start_mark, end_mark):
        self.value = value
        self.start_mark = start_mark
        self.end_mark = end_mark


class TagToken(Token):
    id = "<tag>"

    def __init__(self, value, start_mark, end_mark):
        self.value = value
        self.start_mark = start_mark
        self.end_mark = end_mark


class ScalarToken(Token):
    id = "<scalar>"

    def __init__(self, value, plain, start_mark, end_mark, style=None):
        self.value = value
        self.plain = plain
        self.start_mark = start_mark
        self.end_mark = end_mark
        self.style = style
