python_generator.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  1. import time
  2. from constructs import FormalParameter
  3. from code_generation import CodeGenerator, Platforms
  4. class PythonGenerator(CodeGenerator):
  5. def __init__(self):
  6. self.supported_platforms = [Platforms.Threads, Platforms.GameLoop]
  7. def visit_ClassDiagram(self, class_diagram):
  8. self.fOut.write("# Statechart compiler by Glenn De Jonghe")
  9. self.fOut.write("#")
  10. self.fOut.write("# Date: " + time.asctime())
  11. if class_diagram.name or class_diagram.author or class_diagram.description:
  12. self.fOut.write()
  13. if class_diagram.author:
  14. self.fOut.write("# Model author: " + class_diagram.author)
  15. if class_diagram.name:
  16. self.fOut.write("# Model name: " + class_diagram.name)
  17. if class_diagram.description.strip():
  18. self.fOut.write("# Model description:")
  19. self.fOut.write('"""')
  20. self.fOut.indent()
  21. self.fOut.write(class_diagram.description.strip())
  22. self.fOut.dedent()
  23. self.fOut.write('"""')
  24. self.fOut.write()
  25. #Mandatory imports
  26. self.fOut.write('from python_runtime.statecharts_core import ObjectManagerBase, Event, InstanceWrapper, RuntimeClassBase, Association')
  27. #User imports
  28. if class_diagram.top.strip():
  29. self.writeCodeCorrectIndent(class_diagram.top)
  30. self.fOut.write()
  31. #visit children
  32. for c in class_diagram.classes :
  33. c.accept(self)
  34. #writing out ObjectManager
  35. self.fOut.write('class ObjectManager (ObjectManagerBase):')
  36. self.fOut.indent()
  37. self.fOut.write('def __init__(self, controller):')
  38. self.fOut.indent()
  39. self.fOut.write("super(ObjectManager, self).__init__(controller)")
  40. self.fOut.dedent()
  41. self.fOut.write()
  42. self.fOut.write('def instantiate(self, class_name, construct_params):')
  43. self.fOut.indent()
  44. self.fOut.write("associations = []")
  45. for index, c in enumerate(class_diagram.classes) :
  46. if index == 0 :
  47. self.fOut.write()
  48. else :
  49. self.fOut.write('el')
  50. self.fOut.extendWrite('if class_name == "' + c.name + '" :')
  51. self.fOut.indent()
  52. if c.statechart :
  53. self.fOut.write('instance = ' + c.name + '(self.controller, *construct_params)')
  54. else :
  55. self.fOut.write('instance = ' + c.name + '(*construct_params)')
  56. for a in c.associations :
  57. a.accept(self)
  58. self.fOut.dedent()
  59. self.fOut.write('if instance:')
  60. self.fOut.indent()
  61. self.fOut.write('return InstanceWrapper(instance, associations)')
  62. self.fOut.dedent()
  63. self.fOut.write('else :')
  64. self.fOut.indent()
  65. self.fOut.write('return None')
  66. self.fOut.dedent()
  67. self.fOut.dedent()
  68. self.fOut.dedent()
  69. self.fOut.write()
  70. if self.platform == Platforms.Threads :
  71. controller_sub_class = "ThreadsControllerBase"
  72. elif self.platform == Platforms.GameLoop :
  73. controller_sub_class = "GameLoopControllerBase"
  74. self.fOut.write("from python_runtime.statecharts_core import " + controller_sub_class)
  75. # write out controller
  76. self.fOut.write("class Controller(" + controller_sub_class + "):")
  77. self.fOut.indent()
  78. # write out __init__ method
  79. if class_diagram.default_class.constructors :
  80. for constructor in class_diagram.default_class.constructors :
  81. self.writeControllerConstructor(class_diagram, constructor.parameters)
  82. else :
  83. self.writeControllerConstructor(class_diagram)
  84. self.fOut.dedent()
  85. self.fOut.write("def main():")
  86. self.fOut.indent()
  87. self.fOut.write("controller = Controller()")
  88. self.fOut.write("controller.start()")
  89. self.fOut.dedent()
  90. self.fOut.write()
  91. self.fOut.write('if __name__ == "__main__":')
  92. self.fOut.indent()
  93. self.fOut.write("main()")
  94. self.fOut.dedent()
  95. self.fOut.write()
  96. #helper method
  97. def writeControllerConstructor(self, class_diagram, parameters = []):
  98. self.writeMethodSignature('__init__', parameters + [FormalParameter("keep_running", "", "True")])
  99. self.fOut.indent()
  100. self.fOut.write("super(Controller, self).__init__(ObjectManager(self), keep_running)")
  101. for i in class_diagram.inports:
  102. self.fOut.write('self.addInputPort("' + i + '")')
  103. for i in class_diagram.outports:
  104. self.fOut.write('self.addOutputPort("' + i + '")')
  105. actual_parameters = [p.getIdent() for p in parameters]
  106. self.fOut.write('self.object_manager.createInstance("'+ class_diagram.default_class.name +'", [' + ', '.join(actual_parameters)+ '])')
  107. self.fOut.write()
  108. self.fOut.dedent()
  109. def visit_Class(self, class_node):
  110. """
  111. Generate code for Class construct
  112. """
  113. self.fOut.write()
  114. # take care of inheritance
  115. if class_node.super_classes:
  116. class_node.super_classes.append("RuntimeClassBase")
  117. super_classes = []
  118. for super_class in class_node.super_classes:
  119. super_classes.append(super_class)
  120. self.fOut.write("class " + class_node.name + "(" + ", ".join(super_classes) + "):")
  121. else:
  122. self.fOut.write("class " + class_node.name + "(RuntimeClassBase):")
  123. self.fOut.indent()
  124. self.fOut.write()
  125. if class_node.statechart is not None:
  126. # assign each node a unique ID
  127. self.fOut.write("# Unique IDs for all statechart nodes")
  128. for (i,node) in enumerate(class_node.statechart.composites + class_node.statechart.basics):
  129. self.fOut.write(node.full_name + " = " + str(i))
  130. self.fOut.write()
  131. self.writeMethodSignature("commonConstructor", [FormalParameter("controller", "", "None")])
  132. else :
  133. self.writeMethodSignature("commonConstructor")
  134. self.fOut.indent()
  135. self.fOut.write('"""Constructor part that is common for all constructors."""')
  136. self.fOut.write("RuntimeClassBase.__init__(self)")
  137. # write private input/output ports
  138. self.fOut.write()
  139. self.fOut.write("# User defined input ports")
  140. self.fOut.write("self.inports = {}")
  141. for p in class_node.inports:
  142. self.fOut.write("self.inports[\""+p+"\"] = controller.addInputPort(\""+p+"\", self)")
  143. # write attributes
  144. if class_node.attributes:
  145. self.fOut.write()
  146. self.fOut.write("# User defined attributes")
  147. for attribute in class_node.attributes:
  148. if attribute.init_value is None :
  149. self.fOut.write("self." + attribute.name + " = None")
  150. else :
  151. self.fOut.write("self." + attribute.name + " = " + attribute.init_value)
  152. self.fOut.write()
  153. # if there is a statechart
  154. if class_node.statechart is not None:
  155. self.fOut.write("self.controller = controller")
  156. self.fOut.write("self.object_manager = controller.getObjectManager()")
  157. self.fOut.write("self.current_state = {}")
  158. self.fOut.write("self.history_state = {}")
  159. if class_node.statechart.nr_of_after_transitions:
  160. self.fOut.write("self.timers = {}")
  161. self.fOut.write()
  162. self.fOut.write("#Initialize statechart :")
  163. self.fOut.write()
  164. if class_node.statechart.histories:
  165. for node in class_node.statechart.combined_history_parents:
  166. self.fOut.write("self.history_state[" + class_node.name + "." + node.full_name + "] = []")
  167. self.fOut.write()
  168. for c in class_node.statechart.composites :
  169. self.fOut.write("self.current_state[self." + c.full_name + "] = []")
  170. self.fOut.dedent()
  171. self.fOut.write()
  172. self.writeMethodSignature("start")
  173. self.fOut.indent()
  174. self.fOut.write("super(" + class_node.name + ", self).start()")
  175. if class_node.statechart:
  176. for default_node in class_node.statechart.root.defaults:
  177. if default_node.is_composite:
  178. self.fOut.write("self.enterDefault_" + default_node.full_name + "()")
  179. elif default_node.is_basic:
  180. self.fOut.write("self.enter_" + default_node.full_name + "()")
  181. self.fOut.dedent()
  182. self.fOut.write()
  183. #visit children
  184. for i in class_node.constructors :
  185. i.accept(self)
  186. for i in class_node.destructors :
  187. i.accept(self)
  188. for i in class_node.methods :
  189. i.accept(self)
  190. if class_node.statechart is not None:
  191. class_node.statechart.accept(self)
  192. # write out str method
  193. self.fOut.dedent()
  194. #helper method
  195. def writeMethodSignature(self, name, parameters = []):
  196. self.fOut.write("def " + name + "(self")
  197. for param in parameters :
  198. self.fOut.extendWrite(', ')
  199. param.accept(self)
  200. self.fOut.extendWrite("):")
  201. #helper method
  202. def writeMethod(self, name, parameters, return_type, body):
  203. self.writeMethodSignature(name, parameters)
  204. self.fOut.indent()
  205. if body.strip():
  206. self.writeCodeCorrectIndent(body)
  207. else:
  208. self.fOut.write("return")
  209. self.fOut.write()
  210. self.fOut.dedent()
  211. def visit_FormalParameter(self, formal_parameter):
  212. self.fOut.extendWrite(formal_parameter.getIdent())
  213. if formal_parameter.hasDefault() :
  214. self.fOut.extendWrite(" = " + formal_parameter.getDefault())
  215. def visit_Constructor(self, constructor):
  216. self.fOut.write("#The actual constructor")
  217. parameters = [FormalParameter("controller", "", None)] + constructor.getParams()
  218. self.writeMethodSignature("__init__", parameters)
  219. self.fOut.indent()
  220. if constructor.parent_class.statechart is not None :
  221. self.fOut.write("self.commonConstructor(controller)")
  222. else :
  223. self.fOut.write("self.commonConstructor()")
  224. if constructor.body :
  225. self.fOut.write()
  226. self.fOut.write("#constructor body (user-defined)")
  227. self.writeCodeCorrectIndent(constructor.body)
  228. self.fOut.dedent()
  229. self.fOut.write()
  230. def visit_Destructor(self, destructor):
  231. self.fOut.write("# User defined destructor")
  232. self.writeMethod("__del__", [], "", destructor.body)
  233. def visit_Method(self, method):
  234. self.fOut.write("# User defined method")
  235. self.writeMethod(method.name, method.parameters, method.return_type, method.body)
  236. def visit_Association(self, association):
  237. self.fOut.write('associations.append(Association("' + association.name + '", "' + association.to_class + '", ' + str(association.min) + ', ' + str(association.max) + '))')
  238. #helper method
  239. def writeTransitionsRecursively(self, current_node):
  240. self.fOut.write("def transition_" + current_node.full_name + "(self, event) :")
  241. self.fOut.indent()
  242. valid_children = []
  243. for child in current_node.children :
  244. if child.is_composite or child.is_basic :
  245. valid_children.append(child)
  246. self.fOut.write("catched = False")
  247. do_dedent = False
  248. if current_node.solves_conflict_outer :
  249. self.writeFromTransitions(current_node)
  250. if current_node.is_parallel_state or current_node.is_composite :
  251. self.fOut.write("if not catched :")
  252. self.fOut.indent()
  253. do_dedent = True
  254. if current_node.is_parallel_state:
  255. for child in valid_children :
  256. self.fOut.write("catched = self.transition_" + child.full_name + "(event) or catched")
  257. elif current_node.is_composite:
  258. for i, child in enumerate(valid_children) :
  259. if i > 0 :
  260. self.fOut.write("el")
  261. else :
  262. self.fOut.write()
  263. self.fOut.extendWrite("if self.current_state[self." + current_node.full_name + "][0] == self." + child.full_name + ":")
  264. self.fOut.indent()
  265. self.fOut.write("catched = self.transition_" + child.full_name + "(event)")
  266. self.fOut.dedent()
  267. if current_node.solves_conflict_outer :
  268. if do_dedent :
  269. self.fOut.dedent()
  270. elif len(current_node.transitions) > 0 :
  271. self.fOut.write("if not catched :")
  272. self.fOut.indent()
  273. self.writeFromTransitions(current_node)
  274. self.fOut.dedent()
  275. self.fOut.write("return catched")
  276. self.fOut.dedent()
  277. self.fOut.write();
  278. for child in valid_children :
  279. self.writeTransitionsRecursively(child)
  280. #helper method
  281. def writeFromTransitions(self, current_node):
  282. # get all transition out of this state
  283. out_transitions = current_node.transitions
  284. if len(out_transitions) == 0 :
  285. return
  286. self.fOut.write('enableds = []')
  287. for index, transition in enumerate(out_transitions, start=1):
  288. self.writeTransitionCondition(transition, index)
  289. self.fOut.write("if len(enableds) > 1 :")
  290. self.fOut.indent()
  291. self.fOut.write('print "Runtime warning : indeterminism detected in a transition from node ' + current_node.full_name+ '. Only the first in document order enabled transition is executed."')
  292. self.fOut.dedent()
  293. self.fOut.write()
  294. self.fOut.write("if len(enableds) > 0 :")
  295. self.fOut.indent()
  296. self.fOut.write('enabled = enableds[0]')
  297. for index, transition in enumerate(out_transitions, start=1):
  298. self.writeTransitionAction(transition, index)
  299. self.fOut.write('catched = True')
  300. self.fOut.dedent()
  301. self.fOut.write()
  302. def visit_FormalEventParameter(self, formal_event_parameter):
  303. self.fOut.extendWrite(formal_event_parameter.name)
  304. def writeFormalEventParameters(self, transition):
  305. parameters = transition.getTrigger().getParameters()
  306. if(len(parameters) > 0) :
  307. self.fOut.write('parameters = event.getParameters()')
  308. for index, parameter in enumerate(parameters):
  309. self.fOut.write()
  310. parameter.accept(self)
  311. self.fOut.extendWrite(' = parameters[' + str(index) + ']')
  312. def writeTransitionAction(self, transition, index):
  313. if index > 1 :
  314. self.fOut.write("el")
  315. else :
  316. self.fOut.write()
  317. self.fOut.extendWrite("if enabled == " + str(index) + " :")
  318. self.fOut.indent()
  319. # handle parameters to actually use them
  320. self.writeFormalEventParameters(transition)
  321. exits = transition.getExitNodes()
  322. # write out exit actions
  323. if not exits[-1].is_basic:
  324. self.fOut.write("self.exit_" + exits[-1].full_name + "()")
  325. else:
  326. for node in exits:
  327. if node.is_basic:
  328. self.fOut.write("self.exit_" + node.full_name + "()")
  329. # write out trigger actions
  330. transition.getAction().accept(self)
  331. for (entering_node, is_ending_node) in transition.getEnterNodes() :
  332. if is_ending_node :
  333. if entering_node.is_composite:
  334. self.fOut.write("self.enterDefault_" + entering_node.full_name + "()")
  335. elif entering_node.is_history:
  336. if (entering_node.is_history_deep) :
  337. self.fOut.write("self.enterHistoryDeep_" + entering_node.parent.full_name + "()")
  338. else :
  339. self.fOut.write("self.enterHistoryShallow_" + entering_node.parent.full_name + "()")
  340. else:
  341. self.fOut.write("self.enter_" + entering_node.full_name + "()")
  342. else :
  343. if entering_node.is_composite:
  344. self.fOut.write("self.enter_" + entering_node.full_name + "()")
  345. self.fOut.dedent()
  346. def writeTransitionCondition(self, transition, index):
  347. trigger = transition.getTrigger()
  348. if not trigger.isUC():
  349. self.fOut.write('if event.name == "' + trigger.getEvent() + '" and event.getPort() == "' + trigger.getPort() + '" :')
  350. self.fOut.indent()
  351. # evaluate guard
  352. if transition.hasGuard() :
  353. # handle parameters for guard evaluation
  354. self.writeFormalEventParameters(transition)
  355. self.fOut.write('if ')
  356. transition.getGuard().accept(self)
  357. self.fOut.extendWrite(' :')
  358. self.fOut.indent()
  359. self.fOut.write("enableds.append(" + str(index) + ")")
  360. if transition.hasGuard() :
  361. self.fOut.dedent()
  362. if not trigger.isUC() :
  363. self.fOut.dedent()
  364. self.fOut.write()
  365. def visit_EnterAction(self, enter_method):
  366. parent_node = enter_method.parent_node
  367. self.writeMethodSignature("enter_" + parent_node.full_name, [])
  368. self.fOut.indent()
  369. # take care of any AFTER events
  370. for transition in parent_node.transitions :
  371. trigger = transition.getTrigger()
  372. if trigger.isAfter() :
  373. self.fOut.write("self.timers[" + str(trigger.getAfterIndex()) + "] = ")
  374. trigger.after.accept(self)
  375. if enter_method.action:
  376. enter_method.action.accept(self)
  377. self.fOut.write("self.current_state[self." + parent_node.parent.full_name + "].append(self." + parent_node.full_name + ")")
  378. self.fOut.dedent()
  379. self.fOut.write()
  380. #helper method
  381. def writeEnterDefault(self, entered_node):
  382. self.writeMethodSignature("enterDefault_" + entered_node.full_name, [])
  383. self.fOut.indent()
  384. self.fOut.write("self.enter_" + entered_node.full_name + "()")
  385. if entered_node.is_composite:
  386. l = entered_node.defaults
  387. for i in l:
  388. if i.is_composite:
  389. self.fOut.write("self.enterDefault_" + i.full_name + "()")
  390. elif i.is_basic:
  391. self.fOut.write("self.enter_" + i.full_name + "()")
  392. self.fOut.dedent()
  393. self.fOut.write()
  394. def visit_ExitAction(self, exit_method):
  395. exited_node = exit_method.parent_node
  396. self.writeMethodSignature("exit_" + exited_node.full_name, [])
  397. self.fOut.indent()
  398. #If the exited node is composite take care of potential history and the leaving of descendants
  399. if exited_node.is_composite :
  400. #handle history
  401. if exited_node.save_state_on_exit :
  402. self.fOut.write("self.history_state[self." + exited_node.full_name + "] = self.current_state[self." + exited_node.full_name + "]")
  403. #Take care of leaving children
  404. children = exited_node.children
  405. if exited_node.is_parallel_state:
  406. for child in children:
  407. if not child.is_history :
  408. self.fOut.write("self.exit_" + child.full_name + "()")
  409. else:
  410. for child in children:
  411. if not child.is_history :
  412. self.fOut.write("if self." + child.full_name + " in self.current_state[self." + exited_node.full_name + "] :")
  413. self.fOut.indent()
  414. self.fOut.write("self.exit_" + child.full_name + "()")
  415. self.fOut.dedent()
  416. # take care of any AFTER events
  417. for transition in exited_node.transitions :
  418. trigger = transition.getTrigger()
  419. if trigger.isAfter() :
  420. self.fOut.write("self.timers.pop(" + str(trigger.getAfterIndex()) + ", None)")
  421. #Execute user-defined exit action if present
  422. if exit_method.action:
  423. exit_method.action.accept(self)
  424. #Adjust state
  425. self.fOut.write("self.current_state[self." + exited_node.parent.full_name + "] = []") # SPECIAL CASE FOR ORTHOGONAL??
  426. self.fOut.dedent()
  427. self.fOut.write()
  428. #helper method
  429. def writeEnterHistory(self, entered_node, is_deep):
  430. self.writeMethodSignature("enterHistory" + ("Deep" if is_deep else "Shallow") + "_" + entered_node.full_name, [])
  431. self.fOut.indent()
  432. self.fOut.write("if self.history_state[self." + entered_node.full_name + "] == []:")
  433. self.fOut.indent()
  434. defaults = entered_node.defaults
  435. for node in defaults:
  436. if node.is_basic :
  437. self.fOut.write("self.enter_" + node.full_name + "()")
  438. elif node.is_composite :
  439. self.fOut.write("self.enterDefault_" + node.full_name + "()")
  440. self.fOut.dedent()
  441. self.fOut.write("else:")
  442. self.fOut.indent()
  443. children = entered_node.children
  444. if entered_node.is_parallel_state:
  445. for child in children:
  446. if not child.is_history :
  447. self.fOut.write("self.enterHistory" + ("Deep" if is_deep else "Shallow") + "_" + child.full_name + "()")
  448. else:
  449. for child in children:
  450. if not child.is_history :
  451. self.fOut.write("if self." + child.full_name + " in self.history_state[self." + entered_node.full_name + "] :")
  452. self.fOut.indent()
  453. if child.is_composite:
  454. if is_deep :
  455. self.fOut.write("self.enter_" + child.full_name + "()")
  456. self.fOut.write("self.enterHistoryDeep_" + child.full_name + "()")
  457. else :
  458. self.fOut.write("self.enterDefault_" + child.full_name + "()")
  459. else:
  460. self.fOut.write("self.enter_" + child.full_name + "()")
  461. self.fOut.dedent()
  462. self.fOut.dedent()
  463. self.fOut.dedent()
  464. self.fOut.write()
  465. def visit_StateChart(self, statechart):
  466. self.fOut.write("# Statechart enter/exit action method(s) :")
  467. self.fOut.write()
  468. #visit enter and exit action of children
  469. for i in statechart.composites + statechart.basics:
  470. if i is not statechart.root :
  471. i.enter_action.accept(self)
  472. i.exit_action.accept(self)
  473. # write out statecharts methods for enter/exit state
  474. if len(statechart.composites) > 1 :
  475. self.fOut.write("#Statechart enter/exit default method(s) :")
  476. self.fOut.write()
  477. for i in statechart.composites :
  478. if i is not statechart.root :
  479. self.writeEnterDefault(i)
  480. # write out statecharts methods for enter/exit history
  481. if statechart.histories:
  482. self.fOut.write("#Statechart enter/exit history method(s) :")
  483. self.fOut.write()
  484. for i in statechart.shallow_history_parents:
  485. self.writeEnterHistory(i, False)
  486. for i in statechart.deep_history_parents:
  487. self.writeEnterHistory(i, True)
  488. self.fOut.write("#Statechart transitions :")
  489. self.fOut.write()
  490. self.writeTransitionsRecursively(statechart.root)
  491. # write out transition function
  492. self.fOut.write("# Execute transitions")
  493. self.fOut.write("def transition(self, event = Event(\"\")):")
  494. self.fOut.indent()
  495. self.fOut.write("self.state_changed = self.transition_" + statechart.root.full_name + "(event)")
  496. self.fOut.dedent()
  497. # write out inState function
  498. self.fOut.write("# inState method for statechart")
  499. self.fOut.write("def inState(self, nodes):")
  500. self.fOut.indent()
  501. self.fOut.write("for actives in self.current_state.itervalues():")
  502. self.fOut.indent()
  503. self.fOut.write("nodes = [node for node in nodes if node not in actives]")
  504. self.fOut.write("if not nodes :")
  505. self.fOut.indent()
  506. self.fOut.write("return True")
  507. self.fOut.dedent()
  508. self.fOut.dedent()
  509. self.fOut.write("return False")
  510. self.fOut.dedent()
  511. self.fOut.write()
  512. def visit_ExpressionPartString(self, bare_string):
  513. self.fOut.extendWrite(bare_string.string)
  514. def visit_SelfReference(self, self_reference):
  515. self.fOut.extendWrite("self")
  516. def visit_StateReference(self, state_ref):
  517. self.fOut.extendWrite("[" + ",".join(["self." + node.full_name for node in state_ref.getNodes()]) + "]")
  518. def visit_InStateCall(self, in_state_call):
  519. self.fOut.extendWrite("self.inState(")
  520. in_state_call.target.accept(self)
  521. self.fOut.extendWrite(")")
  522. def visit_RaiseEvent(self, raise_event):
  523. if raise_event.isNarrow() or raise_event.isBroad():
  524. self.fOut.write('send_event = Event("' + raise_event.getEventName() + '", parameters = [')
  525. elif raise_event.isLocal():
  526. self.fOut.write('self.addEvent(Event("' + raise_event.getEventName() +'", parameters = [')
  527. elif raise_event.isOutput():
  528. self.fOut.write('self.controller.outputEvent(Event("' + raise_event.getEventName() + '", port="' + raise_event.getPort() + '", parameters = [')
  529. elif raise_event.isCD():
  530. self.fOut.write('self.object_manager.addEvent(Event("' + raise_event.getEventName() + '", parameters = [self, ')
  531. first_param = True
  532. for param in raise_event.getParameters() :
  533. if first_param :
  534. first_param = False
  535. else :
  536. self.fOut.extendWrite(',')
  537. param.accept(self)
  538. if raise_event.isNarrow():
  539. self.fOut.extendWrite('])')
  540. self.fOut.write('self.object_manager.addEvent(Event("narrow_cast", parameters = [self, ' + raise_event.getTarget() + ' , send_event]))')
  541. elif raise_event.isBroad():
  542. self.fOut.extendWrite('])')
  543. self.fOut.write('self.object_manager.addEvent(Event("broad_cast", parameters = [send_event]))')
  544. else :
  545. self.fOut.extendWrite(']))')
  546. def visit_Script(self, script):
  547. self.writeCodeCorrectIndent(script.code)
  548. def visit_Log(self, log):
  549. self.fOut.write('print "' + log.message + '"')
  550. def visit_Assign(self, assign):
  551. self.fOut.write()
  552. assign.lvalue.accept(self)
  553. self.fOut.extendWrite(" = ")
  554. assign.expression.accept(self)