'Parse a single declaration.
:param tokens:
an iterable of at least one token. Should stop at (before)
the end of the declaration, as marked by a ``;`` or ``}``.
Empty declarations (ie. consecutive ``;`` with only white space
in-between) should be skipped earlier and not passed to
this method.
:returns:
a :class:`Declaration`
:raises:
:class:`~.parsing.ParseError` if the tokens do not match the
\'declaration\' production of the core grammar.'

def parse_declaration(self, tokens):

    tokens = iter(tokens)
    name_token = next(tokens)
    if (name_token.type == u'IDENT'):
        property_name = name_token.value.lower()
    else:
        raise ParseError(name_token, u'expected    a    property    name,    got    {0}'.format(name_token.type))
    token = name_token
    for token in tokens:
        if (token.type == u':'):
            break
        elif (token.type != u'S'):
            raise ParseError(token, u"expected    ':',    got    {0}".format(token.type))
    else:
        raise ParseError(token, u"expected    ':'")
    value = strip_whitespace(list(tokens))
    if (not value):
        raise ParseError(token, u'expected    a    property    value')
    validate_value(value)
    (value, priority) = self.parse_value_priority(value)
    return Declaration(property_name, value, priority, name_token.line, name_token.column)
