expression.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from abc import *
  2. from typing import *
  3. from dataclasses import *
  4. class Variable:
  5. def __init__(self, value):
  6. self.value = value
  7. class DataModel:
  8. def __init__(self, names: Dict[str, Variable]):
  9. self.names = names
  10. @dataclass
  11. class Expression(ABC):
  12. pass
  13. @abstractmethod
  14. def eval(self, events, datamodel):
  15. pass
  16. @dataclass
  17. class Identifier(Expression):
  18. identifier: str
  19. def eval(self, events, datamodel):
  20. return datamodel.names[self.identifier].value
  21. @dataclass
  22. class FunctionCall(Expression):
  23. function: Expression
  24. parameters: List[Expression]
  25. def eval(self, events, datamodel):
  26. f = self.function.eval(events, datamodel)
  27. p = [p.eval(events, datamodel) for p in self.parameters]
  28. return f(*p)
  29. @dataclass
  30. class StringLiteral(Expression):
  31. string: str
  32. def eval(self, events, datamodel):
  33. return self.string
  34. @dataclass
  35. class Array(Expression):
  36. elements: List[Any]
  37. def eval(self, events, datamodel):
  38. return [e.eval(events, datamodel) for e in self.elements]