Muriel/compile from minsky machine
Jump to navigation
Jump to search
This python program compiles Minsky machine program into Muriel program.(Using state 0 means halt, and the program starts from state 1.)
program='''
inc a 2
inc a 3
inc a 4
inc b 5
dec a 4 0
'''
def r(s):
return (s.replace("\\","\\\\")
.replace("\"","\\\"")
.replace('\n','\\n'))
def compile(program):
p=[[x for x in x.split(' ')
if x in{'inc','dec','a','b'}or x.isdigit()]
for x in program.split('\n')if x!='']
d='0';e='0';f='0';g='0';h='0'
i=1
for x in p:
if(x[0],x[1])==('inc','a'):
d+=f'+(c={i})'
h+=f'+({x[2]}*(c={i}))'
if(x[0],x[1])==('inc','b'):
f+=f'+(c={i})'
h+=f'+({x[2]}*(c={i}))'
if(x[0],x[1])==('dec','a'):
e+=f'+((c={i})*(a>0))'
h+=f'+((({x[2]}*(a>0))+(({x[3]})*(a=0)))*(c={i}))'
if(x[0],x[1])==('dec','b'):
g+=f'+((c={i})*(b>0))'
h+=f'+((({x[2]}*(b>0))+(({x[3]})*(b=0)))*(c={i}))'
i+=1
res=f'a:0;b:0;c:1;d:{d};e:{e};f:{f};g:{g};h:{h};\n'
res+=f'D:"d:{d};";\nE:"e:{e};";\nF:"f:{f};";\nG:"g:{g};";\nH:"h:{h};";\n'
res+=r'L:"a:"+$a+";b:"+$b+";.\"a:\"+$a+\"\\nb:\"+$b";'+'\n'
R=r'"S:\""+|S+"\";\na:"+$(a+d-e)+";b:"+$(b+f-g)+";c:"+$h+";"+D+E+F+G+H+"\nD:\""+D+"\";\nE:\""+E+"\";\nF:\""+F+"\";\nG:\""+G+"\";\nH:\""+H+"\";\nL:"+"\"a:\"+$a+\";b:\"+$b+\";.\\\"a:\\\"+$a+\\\"\\\\nb:\\\"+$b\";\nR:"+S+";\n@(%L,0,&L*(c=0))+(%R,0,&R*(c>0))"'
res+='R:'+R+';\n'
res+='@(%L,0,&L*(c=0))+(%R,0,&R*(c>0))'
S=f'S:"{r(R)}";\n'
res=S+res
return res
print(compile(program))
For this example, the output will be:
S:"\"S:\\\"\"+|S+\"\\\";\\na:\"+$(a+d-e)+\";b:\"+$(b+f-g)+\";c:\"+$h+\";\"+D+E+F+G+H+\"\\nD:\\\"\"+D+\"\\\";\\nE:\\\"\"+E+\"\\\";\\nF:\\\"\"+F+\"\\\";\\nG:\\\"\"+G+\"\\\";\\nH:\\\"\"+H+\"\\\";\\nL:\"+\"\\\"a:\\\"+$a+\\\";b:\\\"+$b+\\\";.\\\\\\\"a:\\\\\\\"+$a+\\\\\\\"\\\\\\\\nb:\\\\\\\"+$b\\\";\\nR:\"+S+\";\\n@(%L,0,&L*(c=0))+(%R,0,&R*(c>0))\""; a:0;b:0;c:1;d:0+(c=1)+(c=2)+(c=3);e:0+((c=5)*(a>0));f:0+(c=4);g:0;h:0+(2*(c=1))+(3*(c=2))+(4*(c=3))+(5*(c=4))+(((4*(a>0))+((0)*(a=0)))*(c=5)); D:"d:0+(c=1)+(c=2)+(c=3);"; E:"e:0+((c=5)*(a>0));"; F:"f:0+(c=4);"; G:"g:0;"; H:"h:0+(2*(c=1))+(3*(c=2))+(4*(c=3))+(5*(c=4))+(((4*(a>0))+((0)*(a=0)))*(c=5));"; L:"a:"+$a+";b:"+$b+";.\"a:\"+$a+\"\\nb:\"+$b"; R:"S:\""+|S+"\";\na:"+$(a+d-e)+";b:"+$(b+f-g)+";c:"+$h+";"+D+E+F+G+H+"\nD:\""+D+"\";\nE:\""+E+"\";\nF:\""+F+"\";\nG:\""+G+"\";\nH:\""+H+"\";\nL:"+"\"a:\"+$a+\";b:\"+$b+\";.\\\"a:\\\"+$a+\\\"\\\\nb:\\\"+$b\";\nR:"+S+";\n@(%L,0,&L*(c=0))+(%R,0,&R*(c>0))"; @(%L,0,&L*(c=0))+(%R,0,&R*(c>0))
And the output of this Muriel program will be:
a:0 b:4