Example #1
0
    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
Example #2
0
 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()))
Example #3
0
 def _parse_test(self, klass, expr):
     self.assertEqual(unparse(parse(klass, expr)), expr)
Example #4
0
 def test_eval_int(self):
     p = parse(Atom, "123")
     env = InterpreterEnv(lisp.BUILTINS)
     self.assertEqual(env.eval(p.code()), 123)
Example #5
0
 def test_eval_sexpr(self):
     p = parse(SExpr, "(+ 123 456)")
     env = InterpreterEnv(lisp.BUILTINS)
     self.assertEqual(env.eval(p.code()), 579)
Example #6
0
 def _parse_test(self, klass, expr):
     self.assertEqual(unparse(parse(klass, expr)), expr)
Example #7
0
 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()))
Example #8
0
 def test_eval_sexpr(self):
     p = parse(SExpr, '(+ 123 456)')
     env = InterpreterEnv(lisp.BUILTINS)
     self.assertEqual(env.eval(p.code()), 579)
Example #9
0
 def test_eval_int(self):
     p = parse(Atom, '123')
     env = InterpreterEnv(lisp.BUILTINS)
     self.assertEqual(env.eval(p.code()), 123)
Example #10
0
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