none-None1

ABCDXYZ interpreter

Jun 23rd, 2024
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.24 KB | Source Code | 0 0
  1. # First real interpreter for ABCDXYZ, in Python, by User:None1
  2. # Usage: python abcdxyz.py <filename>
  3. import sys
  4. call_stack=[]
  5. objects=[]
  6. class ABCDXYZ:
  7.     data=0
  8.     def __init__(self,event,num):
  9.         self.event,self.num=event,num
  10.     def x(self,num):
  11.         t=objects[num].data
  12.         objects[num].data=[1,2,3,0][objects[num].data]
  13.         if t==1:
  14.             objects[num].fire()
  15.     def y(self,num):
  16.         t=objects[num].data
  17.         objects[num].data=[1,2,3,0][objects[num].data]
  18.         if t==2:
  19.             objects[num].fire()
  20.     def z(self,num):
  21.         if objects[num].data:
  22.             objects[num].data=[0,3,1,2][objects[num].data]
  23.     def fire(self):
  24.         global call_stack
  25.         if self.num in call_stack:
  26.             raise RecursionError('Recursion is forbidden')
  27.         call_stack.append(self.num)
  28.         for i in self.event:
  29.             if i[0]=='"':
  30.                 if len(i)!=2 or i[1] not in '0123456789N':
  31.                     raise SyntaxError('" must be followed by digits or N')
  32.                 else:
  33.                     print('\n' if i[1]=='N' else i[1],end='')
  34.             elif i[0]=='X':
  35.                 try:
  36.                     num=int(i[1])
  37.                 except:
  38.                     raise SyntaxError('X must be followed by a number')
  39.                 else:
  40.                     self.x(num)
  41.             elif i[0]=='Y':
  42.                 try:
  43.                     num=int(i[1])
  44.                 except:
  45.                     raise SyntaxError('Y must be followed by a number')
  46.                 else:
  47.                     self.y(num)
  48.             elif i[0]=='Z':
  49.                 try:
  50.                     num=int(i[1])
  51.                 except:
  52.                     raise SyntaxError('Z must be followed by a number')
  53.                 else:
  54.                     self.z(num)
  55.             else:
  56.                 raise SyntaxError('Unknown command: {}'.format(i))
  57.         call_stack.pop()
  58. with open(sys.argv[1],'r') as f:
  59.     c=f.read().split()
  60. n=0
  61. e=[]
  62. if c[0]!=str(n)+':':
  63.     SyntaxError('Cannot find object 0')
  64. del c[0]
  65. while c:
  66.     n+=1
  67.     while c and c[0]!=str(n)+':':
  68.         e.append(c[0])
  69.         del c[0]
  70.     if c:
  71.         del c[0]
  72.     objects.append(ABCDXYZ(e,n-1))
  73.     e=[]
  74. objects[0].fire()
Advertisement
Add Comment
Please, Sign In to add comment