Esempio n. 1
0
 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 )
Esempio n. 2
0
 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