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()
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])))