Tokenizer functional, fragile parsing

This commit is contained in:
etc404
2026-04-26 19:43:50 -06:00
parent da1aba3ab9
commit 7d6b339cc6
4 changed files with 71 additions and 5 deletions
+12 -1
View File
@@ -1,2 +1,13 @@
class Atom:
pass
car: Atom | int | str | bool | None
cdr: Atom | None
def __init__(self, car: Atom|int|str|bool|None, cdr: Atom|None):
self.car = car
self.cdr = cdr
def setval(self, atom: Atom | int | str | bool | None):
self.car = atom
def append(self, atom: Atom):
self.cdr = atom
+5 -1
View File
@@ -1,5 +1,9 @@
import atom
import reader
class Lisp:
def parse(self, expression):
return reader.tokenize(expression)
def evaluate(self, expression: str):
return expression.upper()
return self.parse(expression)
+51
View File
@@ -0,0 +1,51 @@
import re
from typing import Any
import lisp
import atom
class Reader:
tokens: list[str|Any]
def __init__(self):
self.tokens = []
self.interpreter = lisp.Lisp()
def tokenize(self, expression: str):
self.tokens += re.findall(r"""[\s,]*[;.*]*([()']|"(?:\\.|[^\\"])*"?|[^\s()'",;]*)""", expression)
while self.peek() != "":
self.read_expression()
self.consume()
def peek(self):
return self.tokens[0]
def consume(self):
token = self.tokens[0]
self.tokens = self.tokens[1:]
return token
def read_expression(self) -> atom.Atom | None:
if len(self.tokens) == 0:
return None
if self.peek() == "(":
self.consume()
return self.read_list()
else:
return self.read_atom()
def read_list(self):
token = self.peek()
last = atom.Atom(None, None)
first = last
while token != ")":
last.setval(self.read_expression())
last.append(atom.Atom(None, None))
last = last.cdr
token = self.peek()
self.consume()
return first
def read_atom(self) -> atom.Atom:
print(self.peek())
return atom.Atom(self.consume(), None)
+3 -3
View File
@@ -1,12 +1,12 @@
import lisp
import reader
def main():
print("Welcome message.")
state = lisp.Lisp()
interpreter = reader.Reader()
# REPL Loop
while True:
expression: str = input("> ")
print(state.evaluate(expression))
interpreter.tokenize(expression)
if __name__ == "__main__":
main()