macchina di URM in python
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:
esempio2.1.urm:
#!/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 Rquesta 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
Etichette:
Informatica
,
python
,
uniud
Iscriviti a:
Post
(
Atom
)