#!/usr/bin/python
import sys
import string

#1. Labos iz autmomata - pretvaranje Moorea u Mealy-a
#(c) 2006 Melita Mihaljevic  <melita.mihaljevic@gmail.com> 

f_moore= open('probna','r') 
print 'procitana stanja za MOOREOV automat su:'

ss = f_moore.readline() 
sst= ss[:-1] 
sst= sst.strip()
skup_stanja = sst.split (',')  
print "skup konacnih stanja Q:", skup_stanja 

su = f_moore.readline()
sut = su[:-1]
sut= sut.strip()
skup_ulaznih =sut.split (',')
print "skup prihvatljivih ulaznih zakova ", skup_ulaznih  

si =f_moore.readline()
sit= si[:-1]
sit= sit.strip()
skup_izlaznih = sit.split(',')
print "skup izlaznih znakova :", skup_izlaznih

ps=f_moore.readline()
pocetno_stanje=ps[:-1]
pocetno_stanje= pocetno_stanje.strip()
print "pocetno stanje [", pocetno_stanje,"]"  

r = f_moore.readline()
razdvajanje =r[:-1]
razdvajanje= razdvajanje.strip()
brojac = 0 

if (razdvajanje == '-----'):
	
	lista_prijelaza =[]
	lista_izlaza =[]
	for line in f_moore:
		l = line[:-1]
		l=l.strip()
		if (l != "-----"):
			lista_prijelaza.append(l)
	
		else:
			break
	print "lista prijelaza :", lista_prijelaza 

	for line in f_moore:
		l = line[:-1]
		l = l.strip()
		lista_izlaza.append(l)
	print " lista izlaza ", lista_izlaza
 
else: 
	print 'krivo formatirana datoteka' 
	sys.exit(1)  

f_moore.close()

funkcija_prijelaza = {}

for prijelaz in lista_prijelaza:
	stanje_fp, uneseniZnak_fp = prijelaz.split('=')[0].split(',')
	novoStanje_fp = prijelaz.split('=')[1]
	if novoStanje_fp in skup_stanja:
		funkcija_prijelaza[(stanje_fp, uneseniZnak_fp)] = novoStanje_fp
	else:
		print ' funkcija prijelaza nije dobro zadana'
		sys.exit(1)
		
funkcija_izlaza = {}

for izlaz in lista_izlaza: 
	stanje_fi = izlaz.split('=')[0]
	if stanje_fi in skup_stanja:
		novo =izlaz.split('=')[1]
		if novo in skup_izlaznih:
			funkcija_izlaza [(stanje_fi)] = novo
		else:
			print 'funkcija izlaza nije dobro zadana'
			sys.exit(1)

	else :
		print 'funkcija izlaza nije dobro zadana'
		sys.exit(1)

mi_pretvornik = []
stanje_pretvornik = pocetno_stanje
mealyt_pretvornik= []
mealydat1_pretvornik= []
lista_fizpret= []
pomocnip = []
lista_mltpret = []
mealy_pretvoren = {}
mealydat_pretvornik =' '

for stanje in skup_stanja:	
	for znak in skup_ulaznih :
		novos_pretvornik = funkcija_prijelaza[(stanje, znak)]
   		fizl_pretvornik = funkcija_izlaza[(novos_pretvornik)]
               
                mi_pretvornik.append(stanje)
                mi_pretvornik.append(znak)
                mealyt1_pretvornik = ','.join(mi_pretvornik)
                lista_mltpret.append (mealyt1_pretvornik)
                lista_fizpret.append(fizl_pretvornik)
                pomocnip = lista_mltpret + lista_fizpret
                mealyt2_pretvornik ='='.join(pomocnip)

                mealydat_pretvornik = mealydat_pretvornik + mealyt2_pretvornik


        	mealy_pretvoren[(stanje, znak)] =fizl_pretvornik

		mealydatpret = mealydat_pretvornik[1:]
		mealydat1_pretvornik.append(mealydatpret)
		mealydat_pretvornik =' '
		del lista_mltpret[:]
		del lista_fizpret[:]
		del mi_pretvornik[:]

f_mealyp = open('mealy','w')
f_mealyp.writelines(ss)
f_mealyp.writelines(su)
f_mealyp.writelines(si)
f_mealyp.writelines(ps)
odvajanje= '-----\n'
f_mealyp.writelines(odvajanje)
for niz in lista_prijelaza:
        f_mealyp.write(niz)
        f_mealyp.write ('\n')
f_mealyp.writelines(odvajanje)
for niz in mealydat1_pretvornik:
        f_mealyp.write (niz)
        f_mealyp.write ('\n')


f_mealyp.close()


try:
    ULAZNI_NIZ = raw_input ('Daj niz: ')
		
except ValueError:
    print 'Nije unesen ispravan niz'
	
stanjeAutomata = pocetno_stanje

mealy_temp= []
mealy_dat1= []
lista_fizl= []
pomocni = [] 
lista_mlt = []
mealy = {}
mealy_dat =' ' 
stanje_fp= pocetno_stanje
print "Mealy: funkcija_izlaza* = funkcija_izlaza[ funkcija_prijelaza ( trenutno_stanje, ucitani_znak)]"
print " gdje su funkcija_izlaza i funkcija_prijelaza funkcije mooreovog automata"
print" a funkcija_izlaza* istovjetnog mealyevog automata" 

for nesto in ULAZNI_NIZ :
	print 'obradjujem znak', nesto ,' i trenutno stanje:',stanje_fp
	if ( nesto in skup_ulaznih): 
		del mealy_temp[:]
		del lista_fizl[:]
		del lista_mlt[:]

		f_izlaza= mealy_pretvoren[(stanje_fp,nesto)]

		print "IZLAZ = ", f_izlaza		
		print " \n"
		mealy_temp.append(stanje_fp)
		mealy_temp.append(nesto)		
		mealy_temp1 = ','.join(mealy_temp)
		lista_mlt.append (mealy_temp1)
		lista_fizl.append(f_izlaza)
		pomocni = lista_mlt + lista_fizl 
		mealy_temp2 ='='.join(pomocni)

		mealy_dat = mealy_dat + mealy_temp2		

		stanje_fp = funkcija_prijelaza[(stanje_fp,nesto)]
		mealy[(stanje_fp, nesto)] =f_izlaza
			
	else: 	
		print 'znak nije u dozvoljenom skupu ulaznih znakova, ponovo pokreni program'
		sys.exit()
	mealydat = mealy_dat[1:]
	mealy_dat1.append(mealydat)
	mealy_dat =' ' 

moor_dat1= []
pomocni = []
moor_dat =' '
moor_sim = []
stanje_sim = pocetno_stanje
for znak in ULAZNI_NIZ:
	pomocni =funkcija_prijelaza [(stanje_sim, znak)]
	izlaz= funkcija_izlaza [(pomocni)]
	moor_sim.append(pomocni)
	moor_sim.append(izlaz)
	moor_sim1 = '='.join(moor_sim)
	moor_dat= moor_dat +moor_sim1

	stanje_sim = pomocni

	moordat=moor_dat[1:]
	moor_dat1.append(moordat)
	moor_dat= ' '		
	
	del moor_sim[:]

f_mealy = open('mealy_niz','w')
f_mealy.write('\n')
f_mealy.write('moore')
f_mealy.write('\n')
for niz in moor_dat1:
	f_mealy.write(niz)
	f_mealy.write('\n')

f_mealy.write('mealy') 
f_mealy.write('\n') 
for niz in mealy_dat1:
	f_mealy.write (niz)
	f_mealy.write ('\n')

f_mealy.close()
	    

