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:
#!/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

3 commenti :

Anonimo ha detto...

BASSSHHHHHTAAAAAHHHHH!!!!!!!

:DDDD

jurgo ha detto...

Guarda, stavo pensando di fare anche una macchina di turing, ma la hanno già fatta, qnd ti salvi. Cmq questa mattina ho implementato la versione ricorsiva di fibonacci :-)

Anonimo ha detto...

Secondo me non sei del tutto normale.

:)