horrlang/horrlang.py

71 lines
1.8 KiB
Python
Raw Normal View History

2011-09-16 12:39:57 +00:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
class Machine:
def __init__(self, code):
self.mem = [ord(char) for char in code]
self.exc_ptr = 0
self.mem_ptr = 0
def get_integer(self):
parameter = 0
while chr(self.mem[self.exc_ptr + 1]) >= '0' \
and chr(self.mem[self.exc_ptr + 1]) <= '9':
self.exc_ptr += 1
parameter = parameter * 10 + (self.mem[self.exc_ptr] \
- ord('0'))
if parameter == 0:
parameter = 1
return parameter
def L(self):
self.mem_ptr -= self.get_integer()
def R(self):
self.mem_ptr += self.get_integer()
def O(self):
sys.stdout.write(chr(self.mem[self.mem_ptr]))
def I(self):
self.mem[self.mem_ptr] = ord(sys.stdin.read(1))
def N(self):
self.exc_ptr += 1
search = self.mem[self.exc_ptr]
while self.mem[self.exc_ptr] != search:
self.exc_ptr += 1
def P(self):
search = self.mem[self.exc_ptr + 1]
self.exc_ptr -= 1
while self.mem[self.exc_ptr] != search:
self.exc_ptr -= 1
def J(self):
if self.mem[self.mem_ptr] != ord('0'):
search = self.mem[self.exc_ptr + 1]
self.exc_ptr -= 1
while self.mem[self.exc_ptr] != search:
self.exc_ptr -= 1
def H(self):
self.mem[self.mem_ptr] = self.mem[self.mem_ptr] + 1
def K(self):
self.mem[self.mem_ptr] = self.mem[self.mem_ptr] - 1
def run(self):
while True:
if self.exc_ptr >= len(self.mem):
sys.exit(0)
control = chr(self.mem[self.exc_ptr])
if hasattr(self, control):
getattr(self, control)()
self.exc_ptr += 1
Machine(sys.argv[1]).run()