fsaclasses.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. ############### runtime classes
  2. class RunTimeEvent:
  3. def __init__(self, name, time):
  4. self.name = name
  5. self.time = time
  6. class Events:
  7. def __init__(self, events):
  8. self.events = events
  9. def pop(self):
  10. if self.events != []:
  11. return self.events.pop(0)
  12. def getInputAt(self,time):
  13. input = None
  14. while self.events != []:
  15. if(self.events[0].time <= time):
  16. input = self.events.pop(0)
  17. break
  18. else:
  19. break
  20. return input
  21. ############### static classes - invariants
  22. class Expression:
  23. def __init__(self):
  24. pass
  25. class FSAModel:
  26. def __init__(self,states,transitions):
  27. self.transitions = transitions
  28. self.states = states
  29. self.initialState = None
  30. def getTransitionFrom(self, state, event):
  31. if event == None:
  32. return None
  33. for t in self.transitions:
  34. if t.source == state and isinstance(t.trigger,Event) and t.trigger.name == event.name:
  35. return t
  36. return None
  37. def getTransitionAfter(self, state, elapsed):
  38. for t in self.transitions:
  39. if t.source == state and isinstance(t.trigger,After):
  40. if ExpressionVisitor(t.trigger.after).visit() <= elapsed:
  41. return t
  42. return None
  43. class ExpressionVisitor:
  44. def __init__(self, expression):
  45. self.expression = expression
  46. def visit(self):
  47. if(isinstance(self.expression,AtomValue)):
  48. return self.expression.value
  49. if(isinstance(self.expression,Operation)):
  50. left = ExpressionVisitor(self.expression.left).visit()
  51. right = ExpressionVisitor(self.expression.right).visit()
  52. if(self.expression.op == '+'):
  53. return left + right
  54. if(self.expression.op == '-'):
  55. return left - right
  56. if(self.expression.op == '*'):
  57. return left * right
  58. if(self.expression.op == '/'):
  59. return left / right
  60. if(self.expression.op == 'and'):
  61. return left and right
  62. if(self.expression.op == 'or'):
  63. return left or right
  64. if(isinstance(self.expression,Not)):
  65. return not ExpressionVisitor(self.expression.expression).visit()
  66. class State:
  67. def __init__(self, name, default = False):
  68. self.name = name
  69. self.final = default
  70. def getName(self):
  71. return self.name
  72. class Operation(Expression):
  73. def __init__(self, left, right, op):
  74. self.op = op
  75. self.left = left
  76. self.right = right
  77. class Transition:
  78. def __init__(self,name, source,target):
  79. self.name = name
  80. self.source = source
  81. self.target = target
  82. self.trigger = None
  83. self.guard = None
  84. class Trigger:
  85. def __init__(self):
  86. pass
  87. class Event(Trigger):
  88. def __init__(self,name):
  89. self.name = name
  90. class After(Trigger):
  91. def __init__(self, expression):
  92. self.after = expression
  93. class Guard:
  94. def __init__(self, expression):
  95. self.expression = expression
  96. class And(Operation):
  97. def __init__(self, lexpression, rexpression):
  98. self.left = lexpression
  99. self.right = rexpression
  100. self.op = "and"
  101. class Or(Operation):
  102. def __init__(self, lexpression, rexpression):
  103. self.left = lexpression
  104. self.right = rexpression
  105. self.op = "or"
  106. class Not(Expression):
  107. def __init__(self, expression):
  108. self.expression = expression
  109. class Variable(Expression):
  110. def __init__(self, varname):
  111. self.name = varname
  112. class AtomValue(Expression):
  113. def __init__(self, value):
  114. self.value = value
  115. class Integer(AtomValue):
  116. def __init__(self, value):
  117. self.value = value
  118. class Float(AtomValue):
  119. def __init__(self, value):
  120. self.value = value
  121. class String(AtomValue):
  122. def __init__(self, value):
  123. self.value = value