Approximately fully functional!

This commit is contained in:
etc404
2026-04-27 00:43:43 -06:00
parent 405f5f545a
commit 4ed01f8439
5 changed files with 187 additions and 13 deletions
+28 -8
View File
@@ -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()