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