예제 #1
0
    def analysis(self):
        Buff = Buffer()
        Stat = State()

        #Buff.add_buff(self.Current)
        #print(Buff.get_buff())
        #print(self.Current)
        self.Current = self.get_next()

        while Stat.get_state() != 'final':

            if Stat.get_state() == 'start':

                if self.Current in self.Separators:
                    self.Current = self.get_next()

                elif self.Current.isalpha():
                    Buff.clear_buff()
                    Buff.add_buff(self.Current)
                    Stat.set_state('ident')
                    self.Current = self.get_next()
                    #print(Buff.get_buff())

                elif self.Current.isdigit():
                    Buff.clear_buff()
                    Buff.add_buff(self.Current)
                    Stat.set_state('numb')
                    self.Current = self.get_next()

                elif self.Current == '{':
                    #ЗАПИСАТЬ КОММЕНТАРИЙ В БУФЕР
                    Stat.set_state('comment')
                    self.Current = self.get_next()

                elif self.Current == '.':
                    Lexems_arr.append(
                        Lexer.Lexer(self.get_pos(), 'Разделитель',
                                    self.Current, 'имя'))
                    Stat.set_state('final')

                elif self.Current in self.Delimiters:
                    Stat.set_state('delimit')
                    self.Current = self.get_next()
예제 #2
0
    def get_lex(self):
        buff = Buffer()
        stat = State()
        dict_state = dict_of_states()

        if self.curr_symbs[1] == '':
            self.curr_symbs[1] = self.get_next_symb()

        while True:
            self.get__next()

            if stat.get_state() == 1:
                next_state = dict_state.find_state(
                    stat.get_state(), self.define_symb(self.curr_symbs[1]),
                    self.define_symb(self.curr_symbs[0]))
                stat.set_state(next_state)

            lexem_type = stat.get_state()
            next_state = dict_state.find_state(
                stat.get_state(), self.define_symb(self.curr_symbs[0]),
                self.define_symb(self.curr_symbs[1]))
            #print('states ', stat.get_state(), '--->' ,next_state, '  ;  symbs ', self.curr_symbs[0],"---> ", self.curr_symbs[1], self.curr_l, self.curr_p, buff.get_buff())

            self.state_action(stat.get_state(), buff)

            if stat.get_state() == 7:
                #строка, номер символа и текст сообщения об ошибке

                if self.curr_symbs[0] == "":

                    str_err = str(self.curr_l) + ":" + str(
                        self.curr_p) + " Unexpected end of file"
                    raise ValueError(str_err)
                str_err = str(self.curr_l) + ":" + str(
                    self.curr_p
                ) + " Unexpected symbol " + "'" + self.curr_symbs[0] + "'"
                raise ValueError(str_err)

# 		ВЫНЕСТИ В ОТДЕЛЬНУЮ ФУНКЦИЮ

            if stat.get_state() == 4 and self.define_symb(
                    self.curr_symbs[0]) == "N" and self.curr_symbs[1] == ".":
                self.get__next()
                if self.define_symb(self.curr_symbs[1]) == "N":
                    next_state = 41
                    buff.add_buff(self.curr_symbs[0])
                elif self.define_symb(self.curr_symbs[1]) == ".":
                    self.init_array = True
                    return self.create_lex(buff, 4)
                else:
                    next_state = 7
                    str_err = str(
                        self.curr_l) + ":" + str(self.curr_p +
                                                 1) + " Expected number or '.'"
                    raise ValueError(str_err)
                    #buff.add_buff(self.curr_symbs[0])
#		--->

            stat.set_state(next_state)

            #print(lexem_type, self.curr_symbs[0], self.lexem_pos)
            if stat.get_state() == 1:
                #if lexem_type == 80:
                #buff.clear_buff()
                #self.lexem_pos = -1
                if buff.get_buff() != "":
                    if lexem_type == 9:
                        if buff.get_buff()[0] == buff.get_buff()[-1] == "'":
                            return self.create_lex(buff, 5)
                        if buff.get_buff()[0] == "{" and buff.get_buff(
                        )[-1] == "}":
                            return self.create_lex(buff, 81)
                        if not buff.get_buff() in self.Delimiters:

                            str_err = str(self.curr_l) + ":" + str(
                                self.curr_p
                            ) + " Wrong delimiter " + "'" + buff.get_buff(
                            ) + "'"
                            raise ValueError(str_err)
                            #stat.set_state(7)
                        else:
                            return self.create_lex(buff, lexem_type)
                    else:
                        return self.create_lex(buff, lexem_type)

            if stat.get_state() == 3:
                if buff.get_buff() == "":
                    return self.create_lex(buff, 3)
                else:
                    return self.create_lex(
                        buff,
                        dict_state.find_state(
                            1, self.define_symb(self.curr_symbs[0]),
                            self.define_symb(self.curr_symbs[0])))