Advertisement
Guest User

Untitled

a guest
Oct 25th, 2014
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.92 KB | None | 0 0
  1. # author: Anastasia Gaydashenko (a.v.gaydashenko@gmail.com)
  2.  
  3. class Scope(object):
  4.     def __init__(self, parent = None):
  5.         self.parent = parent
  6.         self.dictionary = {}
  7.     def __setitem__(self, key, value):
  8.         self.dictionary[key] = value
  9.     def __getitem__(self, item):
  10.         if (item in self.dictionary):
  11.             return self.dictionary[item]
  12.         elif (self.parent != None):
  13.             return self.parent[item]
  14.  
  15. class Node(object):
  16.     pass
  17.  
  18. class Number(Node):
  19.     def __init__(self, value):
  20.         self.value = int(value)
  21.     def evaluate(self, scope):
  22.         return self
  23.  
  24. class Function(Node):
  25.     def __init__(self, args, body):
  26.         self.args = args
  27.         self.body = body
  28.     def evaluate(self, scope):
  29.         result = None
  30.         for element in self.body:
  31.             result = element.evaluate(scope)
  32.         return result
  33.  
  34. class FunctionDefinition(Node):
  35.     def __init__(self, name, function):
  36.         self.name = name
  37.         self.function = function
  38.     def evaluate(self, scope):
  39.         scope[self.name] = self.function
  40.  
  41. class Conditional(Node):
  42.     def __init__(self, condition, if_true, if_false = None):
  43.         self.condition = condition
  44.         self.if_true = if_true
  45.         self.if_false = if_false
  46.     def evaluate(self, scope):
  47.         result = None
  48.         value = self.condition.evaluate(scope).value
  49.         if (value) and (self.if_true != None):
  50.             for element in self.if_true:
  51.                 result = element.evaluate(scope)
  52.         elif (self.if_false != None):
  53.             for element in self.if_false:
  54.                 result = element.evaluate(scope)
  55.         return result
  56.  
  57. class Print(Node):
  58.     def __init__(self, expr):
  59.         self.expr = expr
  60.     def evaluate(self, scope = None):
  61.         print (self.expr.evaluate(scope).value)
  62.  
  63. class Read(Node):
  64.     def __init__(self, name):
  65.         self.name = name
  66.     def evaluate(self, scope):
  67.         value = input()
  68.         scope[self.name] = Number(value)
  69.  
  70. class FunctionCall(Node):
  71.     def __init__(self, fun_expr, args):
  72.         self.fun_expr = fun_expr
  73.         self.args = args
  74.     def evaluate(self, scope):
  75.         function = self.fun_expr.evaluate(scope)
  76.         call_scope = Scope(scope)
  77.         for i in range(len(function.args)):
  78.             call_scope[function.args[i]] = self.args[i].evaluate(scope)
  79.         return function.evaluate(call_scope)
  80.  
  81. class Reference(Node):
  82.     def __init__(self, name):
  83.         self.name = name
  84.     def evaluate(self, scope):
  85.         return scope[self.name]
  86.  
  87. class BinaryOperation(Node):
  88.     def __init__(self, lhs, op, rhs):
  89.         self.lhs = lhs
  90.         self.op = op
  91.         self.rhs = rhs
  92.     def evaluate(self, scope):
  93.         if (self.op == "+"):
  94.             return Number(self.lhs.evaluate(scope).value + self.rhs.evaluate(scope).value)
  95.         elif (self.op == "-"):
  96.             return Number(self.lhs.evaluate(scope).value - self.rhs.evaluate(scope).value)
  97.         elif (self.op == "*"):
  98.             return Number(self.lhs.evaluate(scope).value * self.rhs.evaluate(scope).value)
  99.         elif (self.op == "/"):
  100.             return Number(self.lhs.evaluate(scope).value / self.rhs.evaluate(scope).value)
  101.         elif (self.op == "%"):
  102.             return Number(self.lhs.evaluate(scope).value % self.rhs.evaluate(scope).value)
  103.         elif (self.op == "=="):
  104.             return Number(self.lhs.evaluate(scope).value == self.rhs.evaluate(scope).value)
  105.         elif (self.op == "!="):
  106.             return Number(self.lhs.evaluate(scope).value != self.rhs.evaluate(scope).value)
  107.         elif (self.op == "<"):
  108.             return Number(self.lhs.evaluate(scope).value < self.rhs.evaluate(scope).value)
  109.         elif (self.op == ">"):
  110.             return Number(self.lhs.evaluate(scope).value > self.rhs.evaluate(scope).value)
  111.         elif (self.op == "<="):
  112.             return Number(self.lhs.evaluate(scope).value <= self.rhs.evaluate(scope).value)
  113.         elif (self.op == ">="):
  114.             return Number(self.lhs.evaluate(scope).value >= self.rhs.evaluate(scope).value)
  115.         elif (self.op == "&&"):
  116.             return Number(self.lhs.evaluate(scope).value and self.rhs.evaluate(scope).value)
  117.         elif (self.op == "||"):
  118.             return Number(self.lhs.evaluate(scope).value or self.rhs.evaluate(scope).value)
  119.  
  120. class UnaryOperation(Node):
  121.     def __init__(self, op, expr):
  122.         self.op = op
  123.         self.expr = expr
  124.     def evaluate(self, scope):
  125.         if (self.op == "-"):
  126.             return Number(-self.expr.evaluate(scope).value)
  127.         elif (self.op == "!"):
  128.             return Number(not self.expr.evaluate(scope).value)
  129.  
  130. if __name__ == "__main__":
  131.     scope = Scope()
  132.  
  133.     frac = Function(["a", "b"], [BinaryOperation(Reference("a"), "/", Reference("b"))])
  134.     FunctionDefinition("frac", frac).evaluate(scope)
  135.     Print(FunctionCall(Reference("frac"), [Number(-30), Number(20)]).evaluate(scope)).evaluate(scope)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement