Beispiel #1
0
    def get_unicode_hex(self):

        flag = 1
        val = 0
        for i in range(4):
            ch = current_char(self)
            if ch >= '0' and ch <= '9':
                ch0 = ch
                val = 16 * val + (ch0 - 48)
                skip_char(self)
            elif ch >= 'a' and ch <= 'f':
                ch0 = ch
                val = 16 * val + (ch0 - 87)
                skip_char(self)
            elif ch >= 'A' and ch <= 'F':
                ch0 = ch
                val = 16 * val + (ch0 - 55)
                skip_char(self)
            else:
                flag = 0
                break
        if flag:
            return PyUnicode_FromOrdinal(val)
        else:
            errors.error(
                self, 'Invalid unicode character %r' %
                self.line[self.pos - 4:self.pos + 1])
Beispiel #2
0
    def get_unicode_hex(self):

        flag = 1
        val = 0
        for i in range(4):
            ch = current_char(self)
            if ch >= '0' and ch <= '9':
                    ch0 = ch
                    val = 16*val + (ch0 - 48)
                    skip_char(self)
            elif ch >= 'a' and ch <= 'f':
                    ch0 = ch
                    val = 16*val + (ch0 - 87)
                    skip_char(self)
            elif ch >= 'A' and ch <= 'F':
                    ch0 = ch
                    val = 16*val + (ch0 - 55)
                    skip_char(self)
            else:
                flag = 0
                break
        if flag:
            return PyUnicode_FromOrdinal(val)
        else:
            errors.error(self, 'Invalid unicode character %r' % self.line[self.pos-4:self.pos+1])
Beispiel #3
0
    def get_base64(self):

        text = None
        ch = next_char(self)
        pos0 = self.pos
        while 1:
            if ch >= '0' and ch <= '9':
                ch = next_char(self)
            elif ch >= 'a' and ch <= 'z':
                ch = next_char(self)
            elif ch >= 'A' and ch <= 'Z':
                ch = next_char(self)
            elif ch == '+' or ch == '/':
                ch = next_char(self)
            elif ch <= ' ':
                if text is None:
                    text = get_chunk(self, pos0)
                else:
                    text += get_chunk(self, pos0)
                self.skip_spaces()
                if self.eof:
                    errors.error(self, 'MIME Base64 string is not finished')
                pos0 = self.pos
                ch = self.line[pos0]
            elif ch == '=':
                ch = next_char(self)
                if ch == '=':
                    ch = next_char(self)

                if text is None:
                    text = get_chunk(self, pos0)
                else:
                    text += get_chunk(self, pos0)
                return self.sbuilder.create_binary(text)
            else:
                raise errors.error(
                    self, 'Invalid character %r in MIME Base64 string' % ch)
Beispiel #4
0
    def get_base64(self):

        text = None
        ch = next_char(self)
        pos0 = self.pos
        while 1:
            if ch >= '0' and ch <= '9':
                ch = next_char(self)
            elif ch >= 'a' and ch <= 'z':
                ch = next_char(self)
            elif ch >= 'A' and ch <= 'Z':
                ch = next_char(self)
            elif ch == '+' or ch == '/':
                ch = next_char(self)
            elif ch <= ' ':
                if text is None:
                    text = get_chunk(self, pos0)
                else:
                    text += get_chunk(self, pos0)
                self.skip_spaces()
                if self.eof:
                    errors.error(self, 'MIME Base64 string is not finished')
                pos0 = self.pos
                ch = self.line[pos0]
            elif ch == '=':
                ch = next_char(self)
                if ch == '=':
                    ch = next_char(self)

                if text is None:
                    text = get_chunk(self, pos0)
                else:
                    text += get_chunk(self, pos0)
                return self.sbuilder.create_binary(text)
            else:
                raise errors.error(self, 'Invalid character %r in MIME Base64 string' % ch)
Beispiel #5
0
    def get_value(self, idn, idn0):
        ch = current_char(self)
        if ch == '#':
            self.skip_comments()
            ch = current_char(self)
            
        if (ch <= '9' and ch >= '0'):
            val = self.get_number()
            return val

        if ch == '-':
            ch = c_unicode_char(self.line, self.pos+1)
            if ch.isdigit():
                return self.get_number()
            else:
                skip_char(self)
                return self.get_negative_constant()
        elif ch == '"':
            text = self.get_string(ch)
            ch = self.skip_spaces()
            if ch == ':':
                errors.error_unexpected_keyval()
            else:                
                return text
        elif ch == '{':
            self.bc += 1
            skip_char(self)
            return self.get_dict_value()
        elif ch == '[':
            self.bs += 1
            skip_char(self)
            return self.get_list_value()
        elif ch == '(':
            self.bq += 1
            skip_char(self)
            return self.get_tuple_value()
        elif ch == '^':
            skip_char(self)
            return self.get_date_time()
        elif ch.isalpha() or ch == '_':
            name = self.get_name()
            val = reserved_name_dict.get(name, c_undefined)
            if val is not c_undefined:
                return val

            ch = self.skip_spaces()
            return self.get_named(name, idn, idn0)                                                  
        elif ch == '`':
            return self.get_string(ch)
        elif ch == "'":
            name = self.get_string(ch)
            self.skip_spaces()
            return self.get_named(name, idn, idn0)
        elif ch == '|':
            return self.get_base64()
        elif ch == '∞': # \U221E
            ch = next_char(self)
            if ch == 'D' or ch == 'd' or ch == '$':
                skip_char(self)
                return self.sbuilder.create_decimal_inf()
            else:
                return self.sbuilder.create_inf()
        elif ch == '?':
            ch = next_char(self)
            if ch == 'D' or ch == 'd' or ch == '$':
                skip_char(self)
                return self.sbuilder.create_decimal_nan()
            else:
                return self.sbuilder.create_nan()
        elif ch == '*':
            skip_char(self)
            label = self.get_label()
            #if self.eof:
            #    errors.error_unexpected_end(self)
            if label is None:
                errors.error_expected_label(self)
            else:
                return self.labeled_objects.get(label, c_undefined)
        elif ch == '&':
            #pos0 = self.pos
            skip_char(self)
            label = self.get_label()
            if label is None:
                errors.error_expected_label(self)

            self.skip_spaces()

            val = self.get_value(idn, idn0)
            self.labeled_objects[label] = val
            return val
        elif ch == '$':
            skip_char(self)
            name = self.get_name()
            val = self.c_constants.get(name, c_undefined)
            if val is c_undefined:
                errors.error(self, "Undefined name %r" % name)
            return val
        elif ch == '∅':                 
            skip_char(self)
            return set()
        else:
            errors.error_unexpected_value(self, 'Unexpected value')
Beispiel #6
0
    def get_string(self, endch):
        text = None
        ch = next_char(self)
        pos0 = self.pos
        while 1:
            if ch == endch:
                if text is None:
                    text = get_chunk(self, pos0)
                else:
                    text += get_chunk(self, pos0)
                skip_char(self)
                return text

            elif ch == '\n' or ch == '\r':
                if text is None:
                    text = get_chunk(self, pos0)
                else:
                    text += get_chunk(self, pos0)
                text += '\n'

                self.next_line()
                if self.eof:
                    errors.error_unexpected_end_string(self)

                #self.skip_whitespace()

                pos0 = self.pos
                ch = current_char(self)
            elif ch == '\\':
                if text is None:
                    text = get_chunk(self, pos0)
                else:
                    text += get_chunk(self, pos0)

                ch = next_char(self)
                if ch == endch:
                    if endch == "'":
                        text += "'"
                    elif endch == '"':
                        text += '"'
                    elif endch == '`':
                        text += '`'
                    else:
                        raise errors.error(self, "String error")
                    skip_char(self)
                elif ch == '\n' or ch == '\r':
                    if text is None:
                        text = get_chunk(self, pos0)
                    else:
                        text += get_chunk(self, pos0)

                    self.next_line()
                    if self.eof:
                        errors.error_unexpected_end_string(self)
#                 elif ch == 'n':
#                     text += "\n"
#                     skip_char(self)
#                 elif ch == 'r':
#                     text += "\r"
#                     skip_char(self)
#                 elif ch == 't':
#                     text += "\t"
#                     skip_char(self)
#                 elif ch == 'u' or ch == 'U':
#                     skip_char(self)
#                     text += self.get_unicode_hex()
                else:
                    text += '\\'
                pos0 = self.pos
                ch = current_char(self)
            else:
                ch = next_char(self)
Beispiel #7
0
 def _check_pairs(self):
     if self.bc > 0:
         errors.error(self, 'Missed closing }')
     elif self.bc < 0:
         errors.error(self, 'Extra closing }')
     
     if self.bs > 0:
         errors.error(self, 'Missed closing ]')
     elif self.bs < 0:
         errors.error(self, 'Extra closing ]')
     
     if self.bq > 0:
         errors.error(self, 'Missed closing )')
     elif self.bq < 0:
         errors.error(self, 'Extra closing )')
     
     if self.ba > 0:
         errors.error(self, 'Missed closing >')
     elif self.ba < 0:
         errors.error(self, 'Extra closing >')
Beispiel #8
0
    def get_list_value(self):
        is_odict = 0

        ch = self.skip_spaces()
        
        if ch == '#':
            self.skip_comments()
            ch = current_char(self)
        
        if self.eof:
            if is_odict:
                errors.error_unexpected_end_odict(self)
            else:    
                errors.error_unexpected_end_list(self)
        
        if ch == ']':
            skip_char(self)
            self.bs -= 1
            return []
        
        if ch == ':':
            ch = next_char(self)
            if ch == ']':
                skip_char(self)
                self.bs -= 1
                return c_new_odict([])
            else:
                errors.error(self, "Invalid empty ordered dict")
                
        val = self.get_keyval_or_value()        
        if type(val) is KeyVal:
            is_odict = 1
            mapping = c_new_odict([])
            mapping[self.keyval.key] = self.keyval.val
        else:
            sequence = [val]
            
        ch = self.skip_spaces()

        while 1:
            if self.eof:
                if is_odict:
                    errors.error_unexpected_end_odict(self)
                else:    
                    errors.error_unexpected_end_list(self)

            if ch == '#':
                self.skip_comments()
                ch = current_char(self)
                
            if ch == ']':
                skip_char(self)
                self.bs -= 1
                if is_odict:
                    return mapping
                else:
                    return sequence

            if is_odict:
                self.get_keyval_odict(mapping)
            else:
                sequence.append(self.get_value(0, 0))
                
            ch = self.skip_spaces()
Beispiel #9
0
    def get_value(self, idn, idn0):
        ch = current_char(self)
        if ch == '#':
            self.skip_comments()
            ch = current_char(self)

        if (ch <= '9' and ch >= '0'):
            val = self.get_number()
            return val

        if ch == '-':
            ch = c_unicode_char(self.line, self.pos + 1)
            if ch.isdigit():
                return self.get_number()
            else:
                skip_char(self)
                return self.get_negative_constant()
        elif ch == '"':
            text = self.get_string(ch)
            ch = self.skip_spaces()
            if ch == ':':
                errors.error_unexpected_keyval()
            else:
                return text
        elif ch == '{':
            self.bc += 1
            skip_char(self)
            return self.get_dict_value()
        elif ch == '[':
            self.bs += 1
            skip_char(self)
            return self.get_list_value()
        elif ch == '(':
            self.bq += 1
            skip_char(self)
            return self.get_tuple_value()
        elif ch == '^':
            skip_char(self)
            return self.get_date_time()
        elif ch.isalpha() or ch == '_':
            name = self.get_name()
            val = reserved_name_dict.get(name, c_undefined)
            if val is not c_undefined:
                return val

            ch = self.skip_spaces()
            return self.get_named(name, idn, idn0)
        elif ch == '`':
            return self.get_string(ch)
        elif ch == "'":
            name = self.get_string(ch)
            self.skip_spaces()
            return self.get_named(name, idn, idn0)
        elif ch == '|':
            return self.get_base64()
        elif ch == '∞':  # \U221E
            ch = next_char(self)
            if ch == 'D' or ch == 'd' or ch == '$':
                skip_char(self)
                return self.sbuilder.create_decimal_inf()
            else:
                return self.sbuilder.create_inf()
        elif ch == '?':
            ch = next_char(self)
            if ch == 'D' or ch == 'd' or ch == '$':
                skip_char(self)
                return self.sbuilder.create_decimal_nan()
            else:
                return self.sbuilder.create_nan()
        elif ch == '*':
            skip_char(self)
            label = self.get_label()
            #if self.eof:
            #    errors.error_unexpected_end(self)
            if label is None:
                errors.error_expected_label(self)
            else:
                return self.labeled_objects.get(label, c_undefined)
        elif ch == '&':
            #pos0 = self.pos
            skip_char(self)
            label = self.get_label()
            if label is None:
                errors.error_expected_label(self)

            self.skip_spaces()

            val = self.get_value(idn, idn0)
            self.labeled_objects[label] = val
            return val
        elif ch == '$':
            skip_char(self)
            name = self.get_name()
            val = self.c_constants.get(name, c_undefined)
            if val is c_undefined:
                errors.error(self, "Undefined name %r" % name)
            return val
        elif ch == '∅':
            skip_char(self)
            return set()
        else:
            errors.error_unexpected_value(self, 'Unexpected value')
Beispiel #10
0
    def get_string(self, endch):
        text = None
        ch = next_char(self)
        pos0 = self.pos
        while 1:
            if ch == endch:
                if text is None:
                    text = get_chunk(self, pos0)
                else:
                    text += get_chunk(self, pos0)
                skip_char(self)
                return text

            elif ch == '\n' or ch == '\r':
                if text is None:
                    text = get_chunk(self, pos0)
                else:
                    text += get_chunk(self, pos0)
                text += '\n'

                self.next_line()
                if self.eof:
                    errors.error_unexpected_end_string(self)

                #self.skip_whitespace()

                pos0 = self.pos
                ch = current_char(self)
            elif ch == '\\':
                if text is None:
                    text = get_chunk(self, pos0)
                else:
                    text += get_chunk(self, pos0)

                ch = next_char(self)
                if ch == endch:
                    if endch == "'":
                        text += "'"
                    elif endch == '"':
                        text += '"'
                    elif endch == '`':
                        text += '`'
                    else:
                        raise errors.error(self, "String error")
                    skip_char(self)
                elif ch == '\n' or ch == '\r':
                    if text is None:
                        text = get_chunk(self, pos0)
                    else:
                        text += get_chunk(self, pos0)

                    self.next_line()
                    if self.eof:
                        errors.error_unexpected_end_string(self)
#                 elif ch == 'n':
#                     text += "\n"
#                     skip_char(self)
#                 elif ch == 'r':
#                     text += "\r"
#                     skip_char(self)
#                 elif ch == 't':
#                     text += "\t"
#                     skip_char(self)
#                 elif ch == 'u' or ch == 'U':
#                     skip_char(self)
#                     text += self.get_unicode_hex()
                else:
                    text += '\\'
                pos0 = self.pos
                ch = current_char(self)
            else:
                ch = next_char(self)
Beispiel #11
0
    def _check_pairs(self):
        if self.bc > 0:
            errors.error(self, 'Missed closing }')
        elif self.bc < 0:
            errors.error(self, 'Extra closing }')

        if self.bs > 0:
            errors.error(self, 'Missed closing ]')
        elif self.bs < 0:
            errors.error(self, 'Extra closing ]')

        if self.bq > 0:
            errors.error(self, 'Missed closing )')
        elif self.bq < 0:
            errors.error(self, 'Extra closing )')

        if self.ba > 0:
            errors.error(self, 'Missed closing >')
        elif self.ba < 0:
            errors.error(self, 'Extra closing >')
Beispiel #12
0
    def get_list_value(self):
        is_odict = 0

        ch = self.skip_spaces()

        if ch == '#':
            self.skip_comments()
            ch = current_char(self)

        if self.eof:
            if is_odict:
                errors.error_unexpected_end_odict(self)
            else:
                errors.error_unexpected_end_list(self)

        if ch == ']':
            skip_char(self)
            self.bs -= 1
            return []

        if ch == ':':
            ch = next_char(self)
            if ch == ']':
                skip_char(self)
                self.bs -= 1
                return c_new_odict([])
            else:
                errors.error(self, "Invalid empty ordered dict")

        val = self.get_keyval_or_value()
        if type(val) is KeyVal:
            is_odict = 1
            mapping = c_new_odict([])
            mapping[self.keyval.key] = self.keyval.val
        else:
            sequence = [val]

        ch = self.skip_spaces()

        while 1:
            if self.eof:
                if is_odict:
                    errors.error_unexpected_end_odict(self)
                else:
                    errors.error_unexpected_end_list(self)

            if ch == '#':
                self.skip_comments()
                ch = current_char(self)

            if ch == ']':
                skip_char(self)
                self.bs -= 1
                if is_odict:
                    return mapping
                else:
                    return sequence

            if is_odict:
                self.get_keyval_odict(mapping)
            else:
                sequence.append(self.get_value(0, 0))

            ch = self.skip_spaces()