RuleExecuter.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from concrete_syntax.textual_od.renderer import render_od
  2. import pprint
  3. from typing import Generator, Callable, Any
  4. from uuid import UUID
  5. import functools
  6. from api.od import ODAPI
  7. from concrete_syntax.common import indent
  8. from transformation.matcher import match_od
  9. from transformation.rewriter import rewrite
  10. from transformation.cloner import clone_od
  11. from util.timer import Timer
  12. from util.loader import parse_and_check
  13. class RuleExecuter:
  14. def __init__(self, state, mm: UUID, mm_ramified: UUID, eval_context={}):
  15. self.state = state
  16. self.mm = mm
  17. self.mm_ramified = mm_ramified
  18. self.eval_context = eval_context
  19. # Generates matches.
  20. # Every match is a dictionary with entries LHS_element_name -> model_element_name
  21. def match_rule(self, m: UUID, lhs: UUID, *, pivot:dict[Any, Any]):
  22. lhs_matcher = match_od(self.state,
  23. host_m=m,
  24. host_mm=self.mm,
  25. pattern_m=lhs,
  26. pattern_mm=self.mm_ramified,
  27. eval_context=self.eval_context,
  28. pivot= pivot,
  29. )
  30. return lhs_matcher
  31. def rewrite_rule(self, m: UUID, rhs: UUID, *, pivot:dict[Any, Any]):
  32. yield rewrite(self.state,
  33. rhs_m=rhs,
  34. pattern_mm=self.mm_ramified,
  35. lhs_match=pivot,
  36. host_m=m,
  37. host_mm=self.mm,
  38. eval_context=self.eval_context,
  39. )
  40. def load_match(self, file: str):
  41. with open(file, "r") as f:
  42. return parse_and_check(self.state, f.read(), self.mm_ramified, file)