Parcly Taxel

Interpreter for 1+ in Python

#!/usr/bin/env python
# 1+ interpreter in Python
# Parcly Taxel / Jeremy Tan, 2014
# Licence is CC BY-SA 4.0 / FAL 1.3 / GNU GPLv3
import sys
from collections import deque

s, sd = deque(), {}

def oneplus(srt = None):
    if not srt:
        if len(sys.argv) != 2:
            print "Usage: " + sys.argv[0] + " [file to be executed]"
            sys.exit(1)
        inp = open(sys.argv[1], 'r')
        raw = inp.read()
        inp.close()
    else: raw = srt
    
    hm, R, bst, B, N = [], {}, deque(), 0, 0
    for c in raw:
        if c == '(':
            B += 1
            bst.append(N)
        if c == ')':
            B -= 1
            R[bst.pop()] = N
            if B < 0:
                print "Imbalanced brackets!"
                sys.exit(2)
        if c == '#' and B == 0: hm.append(N)
        N += 1
    if B != 0:
        print "Imbalanced brackets!"
        sys.exit(2)
    
    N, cmt = 0, False
    while N < len(raw):
        op = raw[N]
        if not cmt:
            if op == '1': s.append(1)
            elif op == '+': s.append(s.pop() + s.pop())
            elif op == '*': s.append(s.pop() * s.pop())
            elif op == '"': s.append(s[-1])
            elif op == '/': s.rotate(1)
            elif op == '\\': s.rotate(-1)
            elif op == '^': s.extend([s.pop(), s.pop()])
            elif op == '<': s.append(0 if s.pop() < s.pop() else 1)
            elif op == '#': N = hm[s.pop()]
            elif op == '.': s.append(abs(int(raw_input('number: '))))
            elif op == ',': s.append(ord(raw_input('character: ')[0]))
            elif op == ':': print s.pop()
            elif op == ';': sys.stdout.write(unichr(s.pop()))
            elif op == '[': cmt = True
            elif op == '(':
                rtn = raw[N + 1:R[N]].partition('|')
                if rtn[1]: sd[rtn[0]] = rtn[2]
                oneplus(sd[rtn[0]])
                N = R[N]
        else:
            if op == ']': cmt = False
        N += 1

if __name__ == "__main__":
    oneplus()
  1. is-the-killer reblogged this from parclytaxel
  2. parclytaxel posted this