#2.Labos iz automata- generator i simulator PA
#(c)  2006. Melita Mihaljevic
#!/usr/bin/python
import sys
import string
import time

skup_stanja = ['q0','q1'] 
pocetno_stanje = 'q0'
f_znakovi = open('abeceda','r')
ulazni_znakovi =[]
for line in f_znakovi:
	l = line[:-1]
	l=l.strip()
	ulazni_znakovi.append(l)

f_znakovi.close()
ulazni_znakovi.append('$')

skup_posebnih = ['*','#','+', '(',')']
skup_ulaznih = ulazni_znakovi + skup_posebnih
kleen =['*','#']
skup_znakova_stoga = ['Q', 'O','Z','M','P','V','Y']
pocetni_znak= 'Q'

stog= []
stog.append('!')
stog.append('Q')
#dictionary za novo stanje i akciju na stogu
#ovo je normalni dio i nadam se da ce raditi
#prijelaz_stanje[stanje, znak] = novo_stanje
prijelaz_stanje={}
prijelaz_stanje[('q0','(')] = 'q0'
prijelaz_stanje[('q0','+')] = 'q0'
prijelaz_stanje[('q0','x')] = 'q0'
prijelaz_stanje[('q0','y')] = 'q0'
prijelaz_stanje[('q0',')')]= 'q1'
prijelaz_stanje[('q1','n')]= 'q0'
prijelaz_stanje[('q0','n')] = 'q0'
#prijelaz_stog [znak,trenutno]= akcija_stog

prijelaz_stog = {}
prijelaz_stog [('(','Q')]= 'QMO'
prijelaz_stog [('(','Z')]= 'OZ'
prijelaz_stog [('(','M')]= 'OM'
prijelaz_stog [('(','Y')]= 'OY'
prijelaz_stog [('(','O')]= 'OVO'
prijelaz_stog [('(','P')]= 'O'
prijelaz_stog [('+','Z')]= 'PZ'
prijelaz_stog [('+','M')]= 'PM'
prijelaz_stog [('+','Y')]= 'PY'
prijelaz_stog [('+','V')]= 'PV'
prijelaz_stog [('x','V')]= 'V'
prijelaz_stog [('x','Z')]= 'Z'
prijelaz_stog [('x','P')]= 'b'
prijelaz_stog [('x','O')]= 'ZO'
prijelaz_stog [('x','M')]= 'M'
prijelaz_stog [('x','Y')]= 'Y'
prijelaz_stog [('x','Q')]= 'YQ'
prijelaz_stog [('y','M')]= 'M'
prijelaz_stog [('y','V')]= 'V'
prijelaz_stog [('y','Y')]= 'Y'
prijelaz_stog [('y','Z')]= 'Z'
prijelaz_stog [(')','V')]= 'b'
prijelaz_stog [(')','Z')]= 'b'

trenutno_stog= 'Q'


def QMO_f(stog) :
	stog.pop()
	stog.append('Q')
	stog.append('M')
	stog.append('O')
def OVO_f(stog):
	stog.pop()
	stog.append('O')
	stog.append('V')
	stog.append('O')
def ZO_f(stog):
	stog.pop()
	stog.append('O')
	stog.append('Z')
def OZ_f(stog):
	stog.pop()
	stog.append('Z')
	stog.append('O')
def PZ_f(stog):
	stog.pop()
	stog.append('Z')
	stog.append('P')
def b_f(stog):
	stog.pop()
def PM_f(stog):
	stog.pop()
	stog.append('M')
	stog.append('P')
def OM_f(stog):
	stog.pop()
	stog.append('M')
	stog.append('O')
def PV_f(stog):
	stog.pop()
	stog.append('V')
	stog.append('P')
def O_f(stog):
	stog.pop()
	stog.append('O')
def YQ_f(stog):
	stog.pop()
	stog.append('Q')
	stog.append('Y')
def OY_f(stog):
	stog.pop()
	stog.append('Y')
	stog.append('O')
def PY_f(stog):
	stog.pop()
	stog.append('Y')
	stog.append('P')
def Z_f(stog):
	stog.pop()
	stog.append('Z')
def M_f(stog):
	stog.pop()
	stog.append('M')
def V_f(stog):
	stog.pop()
	stog.append('V')
def Y_f(stog):
	stog.pop()
	stog.append('Y')

print '---------------------DEFINICIJA POTISNOG AUTOMATA---------------------'
print ' SKUP STANJA = {',skup_stanja,'}'
print ' SKUP ULAZNIH ZNAKOVA = {', skup_ulaznih,'}'
print ' SKUP ZNAKOVA STOGA = {',skup_znakova_stoga,'}'
print ' POCETNO STANJE = qo'
print 'POCETNI ZNAK NA STOGU = Q'
print 'Za funkciju prijelaza obavljena je transliteracija znakova x = znakovi procitani iz datoteke + $, y su Kleenovi operatori'
print 'FUNKCIJA PRIJELAZA:'
print " &(q0,(,Q) = (q0, OMQ)  |  &(q0,(,O) = (q0, OVO)   |  &(q0,x,O) = (q0, ZO)"
print " &(q0,(,Z) = (q0, OZ)   |  &(q0,x,Z) = (q0, Z)     |  &(q0,y,Z) = (q0,FZ) "
print " &(q0,+,Z) = (q0,PZ)    |  &(q0,),Z) = (q1, b)     |  &(q1,n,O) = (q0,b) "
print " &(q0,+,M) = (q0,PM)    |  &(q0, y,M) = (q0,M)     |  &(q0,x,M) = (q0,M) "
print " &(q0,(,M) = (q0,OM)    |  &(q0,x,P) = (q0,b)      |  &(q0,(,P) = (q0,O)"
print " &(q0,x,V) = (q0,V)     |  &(q0,y,V) = (q0,V)      |  &(q0,+,V) = (q0,PV)"
print " &(q0,),V) = (q1,b)     |  &(q0,(,V) = (q0,OV)     |  &(q0,x,Y) = (q0,Y)"
print " &(q0,+,Y) = (q0,PY)    |  &(q0,n,V) = (q0,b)      |  &(q0,n,M) = (q0,b)"
print " &(q0,n,Q) = (q0,b)     |  &(q0,n,Y) = (q0,b)      |  &(q0,x,Q) = (q0,YQ)"
print " &(q0,(,Y) = (q0,OY)    |  &(q0,y,Y)= (q0,Y)       "
print " ako ne navedem transliteracije x i y funkcije prijelaza za ulazne znakove su sljedece:"
for a in ulazni_znakovi: 
	print "&(q0,",a,",V) = (q0,V)   | &(q0,",a,",Z) = (q0, Z) |&(q0,",a,",P) = (q0,b)"
	print "&(q0,",a,",O) = (q0, ZO) | &(q0,",a,",Q) = (q0,YQ)"
for a in kleen :
	print "&(q0,",a,",M)=(q0,M) | &(q0,",a,",V)=(q0,V)| &(q0,",a,",Y)=(q0,Y)| &(q0,",a,",Z)=(q0,FZ) "

DALJE = raw_input('Za simulator utipkaj "simulator"')

if DALJE != 'simulator':
	print 'ocito ne zelis moju zakon simulaciju :('
	sys.exit(0)

f_regexp = open('proba2','r')
space=' '
tab= '\t'
niz = []
niz_s= []
veliki_niz =[]
for n in f_regexp:
		l = n[:-1]
		l= l.strip()
		ni = l.split('\t')
		niz= niz + ni
for a in niz :
	if tab in a:
		niz_s =a.split('	')
		niz.remove(a)
	if space in a:
		niz_s=a.split(' ')
		niz.remove(a)
	niz = niz + niz_s

veliki_niz = veliki_niz + niz

veliki_niz= [e for e in veliki_niz if e !='']

print 'veliki niz', veliki_niz
ostali = ['(',')','+']
trenutno_s = []
trenutnot = stog[1]

for reg_exp in veliki_niz:
	del stog[:]
	stog.append('!')
	stog.append('Q')
	stanje = pocetno_stanje
	novi_niz= reg_exp
	print'reg' ,reg_exp
	z= False
	for znak in reg_exp:
		print '*************************************************'
		print 'znak',znak
		if znak in skup_ulaznih:  
			if znak in ulazni_znakovi:
				ucitani_znak = 'x'
			elif znak in kleen:
				ucitani_znak ='y'
			elif znak in ostali:
				ucitani_znak = znak
		else:
			print'znak nije u skupu znakova , zadani niz nije regularni izraz za abecedu',skup_ulaznih
			break 	

		#ovdje sad ide koristene liste
		if (stanje, ucitani_znak) in prijelaz_stanje.keys():
			novo_stanje = prijelaz_stanje[(stanje, ucitani_znak)]
		
		else:
			print ' zadani niz nije regularan izraz'
			break		
		if (ucitani_znak,trenutnot) in prijelaz_stog.keys():
			akcija = prijelaz_stog[(ucitani_znak, trenutnot)]
		else: 
			print 'zadani niz nije regularan izraz'
			break

		novi_niz= novi_niz[1:len(novi_niz)]
		print 'NIZ:',novi_niz
               	print 'STANJE:', stanje
               	print 'prijelaz:(', stanje,',', znak,',',trenutnot,') = (',novo_stanje,',',akcija,')'
		stanje= novo_stanje
		if akcija == 'QMO':
			QMO = QMO_f(stog)
		if akcija == 'OZ':
			OZ = OZ_f(stog)
		if akcija == 'OM':
			OM = OM_f(stog)
		if akcija == 'OY':
			OY= OY_f(stog)
		if akcija == 'OVO':
			OVO = OVO_f(stog)
		if akcija == 'O':
			O = O_f(stog)
		if akcija == 'PZ':
			PZ = PZ_f(stog)
		if akcija == 'PM':
			PM = PM_f(stog)
		if akcija == 'PY':
			PY = PY_f(stog)
		if akcija == 'PV':
			PV= PV_f(stog)
		if akcija == 'V':
			V= V_f(stog)
		if akcija == 'Z':
			Z = Z_f(stog)
		if akcija == 'b':
			b= b_f(stog)
		if akcija == 'ZO':
			ZO = ZO_f(stog)
		if akcija == 'M':
			M = M_f(stog)
		if akcija == 'Y':
			Y = Y_f(stog)
		if akcija == 'YQ':
			YQ = YQ_f(stog)				
		trenutno = stog[len(stog)-1: len(stog)]
		trenutnot= trenutno[0]
		print'STOG :', stog
		
		if stanje == 'q1':
			stog.pop()
			stanje = 'q0'
			trenutno = stog[len(stog)-1:len(stog)]
			trenutnot = trenutno[0]
		time.sleep(1)
	#ovdje je procito sve znakove i moram probat skidat sa stoga:
	zavrsi = stog.pop()
	print 'prijelaz:(q0, n,',zavrsi,') = (q0,b)' 
	print 'STOG:', stog
	if zavrsi in ('M','Y'):
		h=stog.pop()
		print 'prijelaz:(q0,n,',h,') = (q0,b)'
		print 'STOG:'
		x= stog[0]
		if x == '!':
			print 'PA prihvaca reg exp'

		else:
			print' PA ne prihvaca regexp'
	else:
		print'PA ne prihvaca reg exp'
	del stog[:]
	stog.append('!')
	stog.append('Q')
	trenutnot = 'Q'
	time.sleep(3)
	print' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'
				



