From daa57a1f471d868c335a9063fe35af4e89ccebee Mon Sep 17 00:00:00 2001 From: Loic Nageleisen Date: Fri, 24 Jan 2014 23:11:18 +0100 Subject: [PATCH] basic ast --- repl.py | 6 ++++-- wasp/ast.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++ wasp/parser/box.py | 25 ++++++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 wasp/ast.py diff --git a/repl.py b/repl.py index 0dd107f..c47fa4e 100644 --- a/repl.py +++ b/repl.py @@ -2,7 +2,9 @@ import wasp.parser as parser line = raw_input(">> ") while line != "": - tree = parser.parse(line) - print "^^", tree + ptree = parser.parse(line) + print " ^ %s" % ptree + ast = ptree.ast() + print " ‡ %r" % ast #tree.eval() line = raw_input(">> ") diff --git a/wasp/ast.py b/wasp/ast.py new file mode 100644 index 0000000..d234eb8 --- /dev/null +++ b/wasp/ast.py @@ -0,0 +1,52 @@ +class Node(object): + pass + + +class List(Node): + def __init__(self, car, cdr=None): + self.car = car + self.cdr = cdr + + def eval(self): + pass + + def __repr__(self): + return "" % (self.car, self.cdr) + + +class Atom(Node): + pass + + +class Operator(Node): + pass + + +class Number(Atom): + def __init__(self, value): + self.value = value + + def eval(self): + return self.value + + def __repr__(self): + return "" % self.value + + +class Symbol(Atom): + pass + + +class Quote(Node): + def __init__(self, sexpr): + self.sexpr = sexpr + + def eval(self): + return self.sexpr.eval() + + def __repr__(self): + return "" % self.sexpr + + +class Lambda(Node): + pass diff --git a/wasp/parser/box.py b/wasp/parser/box.py index 0cc5ee7..30ea671 100644 --- a/wasp/parser/box.py +++ b/wasp/parser/box.py @@ -1,4 +1,5 @@ from rply.token import BaseBox +from wasp import ast class Quote(BaseBox): @@ -11,6 +12,9 @@ class Quote(BaseBox): def __str__(self): return "'%s" % self.sexpr + def ast(self): + return ast.Quote(self.sexpr.ast()) + class Pair(BaseBox): def __init__(self, x, y=None): @@ -24,6 +28,24 @@ class Pair(BaseBox): y = self.y return "(%s . %s)" % (self.x, y) + def r_cdr(self, cdr): + if self.y is None: + return (self.x.ast(), ) + else: + return cdr + (self.x.ast(), ) + self.y.r_cdr(cdr) + + def ast(self): + car = self.x.ast() + + if self.y is None: + cdr = None + elif type(self.y) is Pair: + cdr = list(self.y.r_cdr(())) + else: + cdr = self.y.ast() + + return ast.List(car, cdr) + class Atom(BaseBox): def __init__(self, atom): @@ -34,3 +56,6 @@ class Atom(BaseBox): def __str__(self): return "%s" % (self.atom) + + def ast(self): + return ast.Number(int(self.atom))