User:Jan jelo/SKA calculus interpreter

From Esolang
Jump to navigation Jump to search

This is a stack-based SKA calculus interpreter in Python by User:Jan jelo.

def pop(x,l):
 a=l.pop()
 x.append(a)
 if a==')':
  i=1
  while i:
   a=l[-1]
   x.append(l.pop())
   if a=='(':i-=1
   if a==')':i+=1
 return
 y=[];z=[]
 while x:y.append(x.pop())
 while y:z.append(y.pop())
 while z:x.append(z.pop())
def op(l):
 if len(l)==1:return l[0]
 return l[-2]
def copy(x,y):
 a=[]
 while y:a.append(y.pop())
 while a:x.append(a[-1]);y.append(a[-1]);a.pop()
def show(s):
 res=''
 for i in s:
  if i in'()':continue
  elif i=='s1':res+='as'
  elif i=='s2':res+='aas'
  elif i=='k1':res+='ak'
  else:res+=i
 return res
def val(x):
 X=list(x)
 R=[]
 i=0
 while X:
  a=X.pop()
  R.append(a)
  if a=='a':i+=1
  else:i-=1
 if i!=-1:
  raise Exception('The number of "a" does not match with the number of combinators')
 while R:X.append(R.pop())
 while X:
  a=[]
  pop(a,X)
  if a[0]=='a':
   A=[]
   pop(A,R)
   B=[]
   pop(B,R)
   o=op(A)
   if o=='s':
    X.append('(')
    X.append('s1')
    while B:X.append(B.pop())
    X.append(')')
    continue
   if o=='s1':
    A.pop()
    A.pop()
    tmp=[]
    pop(tmp,A)
    X.append('(')
    X.append('s2')
    while tmp:X.append(tmp.pop())
    while B:X.append(B.pop())
    X.append(')')
    continue
   if o=='s2':
    A.pop()
    A.pop()
    tmp=[]
    pop(tmp,A)
    tmp2=[]
    pop(tmp2,A)
    X.append('a')
    X.append('a')
    tmp3=[];copy(tmp3,B)
    while tmp:X.append(tmp.pop())
    while B:X.append(B.pop())
    X.append('a')
    while tmp2:X.append(tmp2.pop())
    while tmp3:X.append(tmp3.pop())
    continue
   if o=='k':
    X.append('(')
    X.append('k1')
    while B:X.append(B.pop())
    X.append(')')
    continue
   if o=='k1':
    A.pop()
    A.pop()
    tmp=[]
    pop(tmp,A)
    while tmp:X.append(tmp.pop())
    continue
  else:
   while a:R.append(a.pop())
 return show(R)
exp='aaaskks'
print(val(exp))# s
exp='aaskk'
print(val(exp))# aaskk