def kreiraj_dka( self ): '''stvaranje dka direktno iz enkas''' # treba vratiti frozenset indexa stanja/stavki #dka_pocetno = self._epsilon_okruzenje( self._pocetno_stanje_index ) dka_pocetno = self._epsilon_okruzenje_rekurzivno( self._pocetno_stanje_index, None ) stanja_dka = [ dka_pocetno ] postoji_neprihvatljivo = False neobradjena = Stog( 0 ) prijelazi_dka = Prijelazi() # dict( int_stanje: dict( znak: int_stanje ) ) #i = 0 while not neobradjena.jest_prazan(): # test ispisi #print( i ) #i += 1 #for eo in self._eokruzenja: #print( eo ) #print() index_stanja_za_obradu = neobradjena.dohvati_vrh() neobradjena.skini() stanje_za_obradu = stanja_dka[ index_stanja_za_obradu ] for z in (self.abeceda | set(['<<!>>'])): novo_stanje = set() # postaje set intova (indexa stavki) for index_stavke in stanje_za_obradu: novo_stanje.update( self.prijelaz_za_niz( index_stavke, [z] ) ) #print( 'novo_stanje:', novo_stanje ) #print() novo_stanje = frozenset( novo_stanje ) if novo_stanje: try: index_novog = stanja_dka.index( novo_stanje ) except ValueError: index_novog = len( stanja_dka ) neobradjena.stavi( index_novog ) stanja_dka.append( novo_stanje ) prijelazi_dka.dodaj( index_stanja_za_obradu, z, index_novog ) else: prijelazi_dka.dodaj( index_stanja_za_obradu, z, -1 ) #print( 'stvaram dka') return DKA( self.stanja, stanja_dka, self.abeceda, prijelazi_dka )
def _epsilon_okruzenje( self, index_stanja ): '''postoji kod za ovo u prvom labosu, u analizatoru; mozda treba prilagoditi tipove i neke detalje, nisam gledao dodatno: vraca se skup indexa na stavke MAK ''' if self._eokruzenja[ index_stanja ] is not None: return self._eokruzenja[ index_stanja ] #stanje = self.stanja[ index_stanja ] #trSt = {stanje} # set trSt = { index_stanja } #S = [stanje] #stog S = Stog( index_stanja ) #while len(S) != 0: while not S.jest_prazan(): #t = S.pop() #jedno stanje t_index = S.dohvati_vrh() S.skini() L = self.prijelazi.dohvati( t_index, '$' ) #L = self.prijelazi.get( (t, '$'), set() ) # skup stanja for v_index in L: if v_index not in trSt: trSt.add(v_index) #S.append(v) S.stavi( v_index ) trSt = frozenset( trSt ) self._eokruzenja[ index_stanja ] = trSt return trSt