L'altra notte non riuscivo a dormire, così ho scritto questa macchina URM per correggermi gli esercizi per l'esame di Honsel. L'ho fatta in quattro ore, credo, due delle quali tra l'una e le tre di notte, ed ovviamente non mi ricordavo python :-), qnd lo sò già che fà schifo, ma d'altronde più ho meno funziona:
#!/usr/bin/python
import re
f=open('./esempio2.1.urm', 'r')
f1=open('./esempio2.1.reg','r')
P=["urm program:"]
P[2:]=f.readlines()#P e il programma (una list di istruzioni)
R=["urm registry:"]
R[2:]=f1.readlines()#R e lo stato iniziale dei registri
indR=1
while indR<len(R):
R[indR]=int(R[indR][0:1])
indR+=1
##CONTROLLO del PROGRAMMA P
indice=1
def escIstrScon(Ik, msg="istruzione URM sconosciuta: "):
print "errore!!"
raise NameError,msg+Ik
while indice<len(P):
Ik=P[indice]
if not re.compile( '^S|^Z|^T|^J' ).match(Ik) :
escIstrScon(Ik)
if not re.compile( '\(' ).match(Ik[1]):
escIstrScon(Ik)
if not re.compile( '\)' ).match(Ik[-2]):
escIstrScon(Ik,"istruzione deve finire con )")
indice+=1
k=1#linea del prog urm in esecuzione
patS = re.compile('^S')
patZ = re.compile('^Z')
patT = re.compile('^T')
patJ = re.compile('^J')
def S(Ik,k):
Ik=re.sub("S\(","",Ik)
Ik=re.sub("\)","",Ik)
n=int(Ik)
R[n]=int(R[n])+1
k+=1
return k
def Z(Ik,k):
Ik=re.sub("Z\(","",Ik)
Ik=re.sub("\)","",Ik)
n=int(Ik)
R[n]=0
k+=1
return k
def T(Ik,k):
Ik=re.sub("T\(","",Ik)
Ik=re.sub("\)","",Ik)
n,m=Ik.split(",")
n=int(n)
m=int(m)
R[m]=int(R[n])
k+=1
return k
def J(Ik,k):
Ik=re.sub("J\(","",Ik)
Ik=re.sub("\)","",Ik)
n,m,q=Ik.split(",")
n=int(n)
m=int(m)
q=int(q)
if (R[n] == R[m] ):
k=q
else:
k+=1
return k
while k<len(P):
print R
Ik=P[k]
print Ik
if patS.match(Ik):
k=S(Ik,k)
elif patZ.match(Ik):
k=Z(Ik,k)
elif patT.match(Ik):
k=T(Ik,k)
elif patJ.match(Ik):
k=J(Ik,k)
else:
print "ERRORE:comando sconosiuto"
break
print "stato finale:"
print R
questa macchina si leggerà i file esempio2.1.urm e esempio2.1.reg (posizionati nella stessa cartella in cui avete urm.py) che contengono rispettivamente il programmma URM e i registri:
esempio2.1.urm:
J(1,2,6)
S(2)
S(3)
J(1,2,6)
J(1,1,2)
T(3,1)
esempio2.1.reg:
9
7
0
0
0
0
0
0