'Yields a list of objects.
Returns keywords, literals, strings, numbers, arrays and dictionaries.
Arrays and dictionaries are represented as Python lists and dictionaries.'

def nextobject(self):

    while (not self.results):
        (pos, token) = self.nexttoken()
        if (isinstance(token, int) or isinstance(token, float) or isinstance(token, bool) or isinstance(token, str) or isinstance(token, PSLiteral)):
            self.push((pos, token))
        elif (token == KEYWORD_ARRAY_BEGIN):
            self.start_type(pos, 'a')
        elif (token == KEYWORD_ARRAY_END):
            try:
                self.push(self.end_type('a'))
            except PSTypeError:
                if STRICT:
                    raise
        elif (token == KEYWORD_DICT_BEGIN):
            self.start_type(pos, 'd')
        elif (token == KEYWORD_DICT_END):
            try:
                (pos, objs) = self.end_type('d')
                if ((len(objs) % 2) != 0):
                    raise PSSyntaxError(('Invalid    dictionary    construct:    %r' % objs))
                d = dict(((literal_name(k), v) for (k, v) in choplist(2, objs) if (v is not None)))
                self.push((pos, d))
            except PSTypeError:
                if STRICT:
                    raise
        elif (token == KEYWORD_PROC_BEGIN):
            self.start_type(pos, 'p')
        elif (token == KEYWORD_PROC_END):
            try:
                self.push(self.end_type('p'))
            except PSTypeError:
                if STRICT:
                    raise
        else:
            if (2 <= self.debug):
                print >>sys.stderr, ('do_keyword:    pos=%r,    token=%r,    stack=%r' % (pos, token, self.curstack))
            self.do_keyword(pos, token)
        if self.context:
            continue
        else:
            self.flush()
    obj = self.results.pop(0)
    if (2 <= self.debug):
        print >>sys.stderr, ('nextobject:    %r' % (obj,))
    return obj
