Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- ObjLang is an esolang where all programs are marshalled Python objects.
- See Esolang Wiki: https://esolangs.org/wiki/ObjLang for details.
- """
- import sys,marshal,base64
- if len(sys.argv)<2:
- print('Input Base64 of program')
- code=marshal.loads(base64.b64decode(input()))
- else:
- with open(sys.argv[1],'rb') as f:
- code=marshal.loads(f.read())
- class Interpreter:
- def __init__(self):
- self.loop_var = []
- self.rules = {}
- self.arglist=[]
- def add_rule(self,rule_name,rule_func):
- self.rules[rule_name]=rule_func
- def rule(self,rule_name):
- def inner_func(func):
- self.add_rule(rule_name,func)
- return inner_func
- def eval_code(self,c):
- if not isinstance(c,dict) and not isinstance(c,list) and not isinstance(c,int) and not isinstance(c,str):
- raise SyntaxError('Must be a dictionary or an integer or a string or a list')
- if not isinstance(c,dict):
- return c
- if len(c)!=1:
- raise SyntaxError('Must have exactly one key')
- k,v=next(iter(c.items()))
- if k not in self.rules:
- raise SyntaxError('Rule "%s" not found'%k)
- return self.rules[k](self,*v)
- inter=Interpreter()
- @inter.rule('print')
- def func(inp,x):
- ev_x=inp.eval_code(x)
- print(ev_x)
- return ev_x
- @inter.rule('input')
- def func(inp):
- return input()
- @inter.rule('intinput')
- def func(inp):
- return int(input())
- @inter.rule('add')
- def func(inp,x,y):
- return inp.eval_code(x)+inp.eval_code(y)
- @inter.rule('sub')
- def func(inp,x,y):
- return inp.eval_code(x)-inp.eval_code(y)
- @inter.rule('mul')
- def func(inp,x,y):
- return inp.eval_code(x)*inp.eval_code(y)
- @inter.rule('div')
- def func(inp,x,y):
- return inp.eval_code(x)//inp.eval_code(y)
- @inter.rule('mod')
- def func(inp,x,y):
- return inp.eval_code(x)%inp.eval_code(y)
- @inter.rule('and')
- def func(inp,x,y):
- return inp.eval_code(x)&inp.eval_code(y)
- @inter.rule('or')
- def func(inp,x,y):
- return inp.eval_code(x)|inp.eval_code(y)
- @inter.rule('not')
- def func(inp,x):
- return ~inp.eval_code(x)
- @inter.rule('xor')
- def func(inp,x,y):
- return inp.eval_code(x)^inp.eval_code(y)
- @inter.rule('lsh')
- def func(inp,x,y):
- return inp.eval_code(x)<<inp.eval_code(y)
- @inter.rule('rsh')
- def func(inp,x,y):
- return inp.eval_code(x)>>inp.eval_code(y)
- @inter.rule('neg')
- def func(inp,x):
- return -inp.eval_code(x)
- @inter.rule('pow')
- def func(inp,x,y):
- return inp.eval_code(x)**inp.eval_code(y)
- @inter.rule('eq')
- def func(inp,x,y):
- return int(inp.eval_code(x)==inp.eval_code(y))
- @inter.rule('neq')
- def func(inp,x,y):
- return int(inp.eval_code(x)!=inp.eval_code(y))
- @inter.rule('geq')
- def func(inp,x,y):
- return int(inp.eval_code(x)>=inp.eval_code(y))
- @inter.rule('leq')
- def func(inp,x,y):
- return int(inp.eval_code(x)<=inp.eval_code(y))
- @inter.rule('lt')
- def func(inp,x,y):
- return int(inp.eval_code(x)<inp.eval_code(y))
- @inter.rule('gt')
- def func(inp,x,y):
- return int(inp.eval_code(x)>inp.eval_code(y))
- @inter.rule('lnt')
- def func(inp,x):
- return int(not bool(inp.eval_code(x)))
- @inter.rule('lnd')
- def func(inp,x,y):
- return int(bool(inp.eval_code(x)) and bool(inp.eval_code(y)))
- @inter.rule('lor')
- def func(inp,x,y):
- return int(bool(inp.eval_code(x)) or bool(inp.eval_code(y)))
- @inter.rule('if')
- def func(inp,x,y,z):
- if inp.eval_code(x):
- return inp.eval_code(y)
- return inp.eval_code(z)
- @inter.rule('for')
- def func(inp,x,y,z):
- ev_y,ev_z=inp.eval_code(y),inp.eval_code(z)
- res=[]
- for i in range(y,z+1):
- inp.loop_var.append(i)
- res.append(inp.eval_code(x))
- inp.loop_var.pop()
- return res
- @inter.rule('while')
- def func(inp,x,y):
- while inp.eval_code(x):
- inp.eval_code(y)
- return 0
- @inter.rule('loop')
- def func(inp):
- return inp.loop_var[-1]
- @inter.rule('str')
- def func(inp,x):
- return chr(inp.eval_code(x))
- @inter.rule('num')
- def func(inp,x):
- return ord(inp.eval_code(x))
- @inter.rule('index')
- def func(inp,x,y):
- return inp.eval_code(x)[inp.eval_code(y)]
- @inter.rule('comma')
- def func(inp,*args):
- return list(map(inp.eval_code,args))
- @inter.rule('func')
- def func(inp,code,command_name,*args):
- def inner_func(inpp,*argss):
- al={}
- for i,j in enumerate(argss):
- al[args[i]]=inpp.eval_code(j)
- inpp.arglist.append(al)
- res=inpp.eval_code(code)
- inpp.arglist.pop()
- return res
- inp.add_rule(command_name,inner_func)
- @inter.rule('arg')
- def func(inp,arg):
- return inp.arglist[-1][arg]
- print('Return value: %r'%inter.eval_code(code))
Add Comment
Please, Sign In to add comment