Approximately fully functional!
This commit is contained in:
@@ -1,24 +1,42 @@
|
||||
import re
|
||||
import lisp
|
||||
from lisp import prettyprint
|
||||
|
||||
|
||||
class Reader:
|
||||
tokens: list[str]
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, outputfile: str):
|
||||
self.tokens = []
|
||||
self.interpreter = lisp.Lisp()
|
||||
self.outputfile = outputfile
|
||||
|
||||
def run(self):
|
||||
while self.peek() != "":
|
||||
self.interpreter.evaluate(self.read_expression())
|
||||
self.consume()
|
||||
if len(self.tokens) == 0:
|
||||
return
|
||||
try:
|
||||
with open(self.outputfile, "a") as file:
|
||||
while self.peek() != "":
|
||||
result = prettyprint(self.interpreter.evaluate(self.read_expression()))
|
||||
print(">> " + result)
|
||||
file.write(result+"\n")
|
||||
except Exception as e:
|
||||
print("ERROR: " + str(e))
|
||||
self.tokens = []
|
||||
return
|
||||
self.flush()
|
||||
|
||||
def tokenize(self, expression: str):
|
||||
self.tokens += re.findall(r"""[\s,]*[;.*]*([()']|"(?:\\.|[^\\"])*"?|[^\s()'",;]*)""", expression)
|
||||
self.tokens += re.findall(r"""(?:;.*|[\s,]*)([()']|"(?:\\.|[^\\"])*"?|[^\s()'",;]*)""", expression)
|
||||
|
||||
def peek(self):
|
||||
return self.tokens[0]
|
||||
|
||||
def flush(self):
|
||||
while len(self.tokens) > 0:
|
||||
if self.peek() == "":
|
||||
self.consume()
|
||||
|
||||
def consume(self):
|
||||
token = self.tokens[0]
|
||||
self.tokens = self.tokens[1:]
|
||||
@@ -34,8 +52,8 @@ class Reader:
|
||||
while token != ")":
|
||||
atomlist.append(self.read_expression())
|
||||
while self.peek() == "":
|
||||
self.consume()
|
||||
expression: str = input("... ")
|
||||
self.flush()
|
||||
expression: str = input("... ").upper()
|
||||
self.tokenize(expression)
|
||||
token = self.peek()
|
||||
self.consume()
|
||||
@@ -43,7 +61,9 @@ class Reader:
|
||||
elif self.peek() == "'":
|
||||
# Expand the quote macro!
|
||||
self.consume()
|
||||
return ["quote", self.read_expression()]
|
||||
return ["QUOTE", self.read_expression()]
|
||||
elif self.peek() == ")":
|
||||
raise SyntaxError("Unexpected ')'")
|
||||
else:
|
||||
return self.read_atom()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user