Пример #1
0
	def analyzation(self):
		buff = Buffer()
		stat = State()
		dict_state = dict_of_states()

		self.curr_p = -1
		self.curr_symbs[1] = self.text[0]

		while stat.get_state()!=3:

			self.get_next()
			print(self.curr_p,'  ', self.curr_symbs[0], self.define_symb(self.curr_symbs[0]), stat.get_state() )

			if stat.get_state() == 1:
				next_state = dict_state.find_state( stat.get_state(), self.define_symb(self.curr_symbs[0]), self.define_symb(self.curr_symbs[0]))
				self.state_act(stat.get_state(),buff, next_state )
				stat.set_state( next_state  )
				print('->' ,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("BUFFER",buff.get_buff())
			self.state_act(stat.get_state(),buff, next_state)
			
			stat.set_state( next_state )
			print('->' ,stat.get_state())
		
		self.state_act(stat.get_state(),buff, 3)

		for i in range(len(self.Lexems_arr)):
			print(self.Lexems_arr[i].get())
Пример #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])))