return ir.String(self.value[1:-1]) class Variable(Atom): parser = ('value', '[^0-9 ()"][^ ()"]*') def code(self): return ir.Lookup(self.value) class SExpr(Node): _required = ['seq'] @staticmethod def parser(): return ['\\(', ('seq', rep(Expr)), '\\)'] def code(self): return ir.Call( self.seq[0].code(), [v.code() for v in self.seq[1:]]) ROOT = os.path.dirname(__file__) BUILTINS = eval.InterpreterEnv() PRELUDE = parse(Program, Scanner(open(ROOT + '/prelude.plisp').read())) BUILTINS.eval(PRELUDE.code()) NODES = [SExpr, Variable, String, Integer, Atom, Expr, Program] if __name__ == '__main__': print '\n'.join('%s := %s' % (l, r) for (l, r) in bnf(NODES)) root = parse(Program, Scanner('(+ 1 2) (+ 1 2)')) print root
def test_eval_program(self): p = parse(Program, "(+ 123 456) (+ 1 2) (+ 4 5 6)") env = InterpreterEnv(lisp.BUILTINS) self.assertEqual(15, env.eval(p.code()))
def _parse_test(self, klass, expr): self.assertEqual(unparse(parse(klass, expr)), expr)
def test_eval_int(self): p = parse(Atom, "123") env = InterpreterEnv(lisp.BUILTINS) self.assertEqual(env.eval(p.code()), 123)
def test_eval_sexpr(self): p = parse(SExpr, "(+ 123 456)") env = InterpreterEnv(lisp.BUILTINS) self.assertEqual(env.eval(p.code()), 579)
def test_eval_program(self): p = parse(Program, '(+ 123 456) (+ 1 2) (+ 4 5 6)') env = InterpreterEnv(lisp.BUILTINS) self.assertEqual(15, env.eval(p.code()))
def test_eval_sexpr(self): p = parse(SExpr, '(+ 123 456)') env = InterpreterEnv(lisp.BUILTINS) self.assertEqual(env.eval(p.code()), 579)
def test_eval_int(self): p = parse(Atom, '123') env = InterpreterEnv(lisp.BUILTINS) self.assertEqual(env.eval(p.code()), 123)
class Variable(Atom): parser = ('value', '[^0-9 ()"][^ ()"]*') def code(self): return ir.Lookup(self.value) class SExpr(Node): _required = ['seq'] @staticmethod def parser(): return ['\\(', ('seq', rep(Expr)), '\\)'] def code(self): return ir.Call(self.seq[0].code(), [v.code() for v in self.seq[1:]]) ROOT = os.path.dirname(__file__) BUILTINS = eval.InterpreterEnv() PRELUDE = parse(Program, Scanner(open(ROOT + '/prelude.plisp').read())) BUILTINS.eval(PRELUDE.code()) NODES = [SExpr, Variable, String, Integer, Atom, Expr, Program] if __name__ == '__main__': print '\n'.join('%s := %s' % (l, r) for (l, r) in bnf(NODES)) root = parse(Program, Scanner('(+ 1 2) (+ 1 2)')) print root