diff --git a/wasp/ast.py b/wasp/ast.py index d234eb8..f1727f8 100644 --- a/wasp/ast.py +++ b/wasp/ast.py @@ -30,11 +30,37 @@ class Number(Atom): return self.value def __repr__(self): - return "" % self.value + return "<%s %s>" % (type(self).__name__, self.value) + + +class Integer(Number): + pass + + +class Float(Number): + pass class Symbol(Atom): - pass + def __init__(self, value): + self.value = value + + def eval(self): + return self.value + + def __repr__(self): + return "" % self.value + + +class String(Atom): + def __init__(self, value): + self.value = value + + def eval(self): + return self.value + + def __repr__(self): + return "" % self.value class Quote(Node): diff --git a/wasp/parser/box.py b/wasp/parser/box.py index 5ba61ca..eba27a8 100644 --- a/wasp/parser/box.py +++ b/wasp/parser/box.py @@ -1,3 +1,4 @@ +import re from rply.token import BaseBox from wasp import ast @@ -58,4 +59,14 @@ class Atom(BaseBox): return "%s" % (self.atom) def ast(self): - return ast.Number(int(self.atom)) + if self.atom[0] == '"': + if self.atom[-1] == '"': + return ast.String(self.atom) + else: + raise ValueError("missing \"") + elif re.match(r'^\d+$', self.atom): + return ast.Integer(int(self.atom)) + elif re.match(r'^\d+\.(\d+)$', self.atom): + return ast.Float(float(self.atom)) + else: + return ast.Symbol(self.atom)