-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathloo.py
60 lines (46 loc) · 1.64 KB
/
loo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import sys
class LooException(Exception):
def __init__(self, message):
super().__init__(message)
class Language(object):
def __init__(self, source_code):
self.data = source_code
self.line_number = 1
self.tokens = []
self.pos = 0
self.memory_cell = 0
self.lexer()
def lexer(self):
character = self.current_character()
while character is not None:
if character == "\n":
self.line_number += 1
elif character == "+":
self.memory_cell += 1
elif character == "-":
self.memory_cell -= 1
elif character == "#":
print(chr(self.memory_cell), end='')
else:
raise LooException(f"Invalid character {character} at line {self.line_number}")
self.pos += 1
character = self.current_character()
def current_character(self):
if len(self.data) == self.pos:
return None
else:
return self.data[self.pos]
class ArgumentParser(object):
def __init__(self, argument):
self.argument = argument
self.length = len(self.argument)
self.parse_arguments()
def parse_arguments(self):
if self.length == 0:
return None
filename = self.argument[0]
if not filename.endswith(".loo"):
raise LooException("Not a loo file")
with open(filename,"r") as source_reader:
lang = Language(source_reader.read())
argument = ArgumentParser(sys.argv[1:])