ramify.alc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. include "primitives.alh"
  2. include "object_operations.alh"
  3. include "modelling.alh"
  4. include "metamodels.alh"
  5. Element function ramify(model : Element):
  6. // Create new model structure
  7. Element new_model
  8. new_model = create_node()
  9. dict_add(new_model, "model", create_node())
  10. dict_add(new_model, "type_mapping", create_node())
  11. dict_add(new_model, "metamodel", model["metamodel"])
  12. dict_add(new_model, "inheritance", model["inheritance"])
  13. // Get local variables for parts
  14. Element old_m
  15. Element new_m
  16. Element mm
  17. new_m = new_model["model"]
  18. old_m = model["model"]
  19. mm = new_model["metamodel"]["model"]
  20. // Add in some primitives
  21. instantiate_node(new_model, "Class", "Natural")
  22. instantiate_node(new_model, "Class", "String")
  23. instantiate_node(new_model, "Class", "Any")
  24. // Add in the complete AL metamodel
  25. add_AL_to_MM(new_model)
  26. // Add some default elements
  27. // Class LHS {
  28. // constraint : funcdef {
  29. // target_upper_cardinality = 1
  30. // }
  31. // upper_cardinality = 1
  32. // lower_cardinality = 1
  33. // }
  34. instantiate_node(new_model, "Class", "LHS")
  35. instantiate_attribute(new_model, "LHS", "lower_cardinality", 1)
  36. instantiate_attribute(new_model, "LHS", "upper_cardinality", 1)
  37. instantiate_link(new_model, "Association", "LHS_constraint", "LHS", "funcdef")
  38. instantiate_attribute(new_model, "LHS_constraint", "name", "constraint")
  39. instantiate_attribute(new_model, "LHS_constraint", "target_upper_cardinality", 1)
  40. // Class Pre_Element {
  41. // label : String {
  42. // target_lower_cardinality = 1
  43. // target_upper_cardinality = 1
  44. // }
  45. // constraint : funcdef {
  46. // target_upper_cardinality = 1
  47. // }
  48. // }
  49. instantiate_node(new_model, "Class", "Pre_Element")
  50. instantiate_link(new_model, "Association", "Pre_Element_label", "Pre_Element", "String")
  51. instantiate_attribute(new_model, "Pre_Element_label", "name", "label")
  52. instantiate_attribute(new_model, "Pre_Element_label", "target_lower_cardinality", 1)
  53. instantiate_attribute(new_model, "Pre_Element_label", "target_upper_cardinality", 1)
  54. instantiate_link(new_model, "Association", "Pre_Element_constraint", "Pre_Element", "funcdef")
  55. instantiate_attribute(new_model, "Pre_Element_constraint", "name", "constraint")
  56. instantiate_attribute(new_model, "Pre_Element_constraint", "target_upper_cardinality", 1)
  57. // Association LHS_contains (LHS, Pre_Element) {}
  58. instantiate_link(new_model, "Association", "LHS_contains", "LHS", "Pre_Element")
  59. instantiate_attribute(new_model, "LHS_contains", "name", "contains")
  60. // Class RHS {
  61. // action : FuncDef {
  62. // target_upper_cardinality = 1
  63. // }
  64. // upper_cardinality = 1
  65. // lower_cardinality = 1
  66. // }
  67. instantiate_node(new_model, "Class", "RHS")
  68. instantiate_attribute(new_model, "RHS", "lower_cardinality", 1)
  69. instantiate_attribute(new_model, "RHS", "upper_cardinality", 1)
  70. instantiate_link(new_model, "Association", "RHS_action", "RHS", "funcdef")
  71. instantiate_attribute(new_model, "RHS_action", "name", "action")
  72. instantiate_attribute(new_model, "RHS_action", "target_upper_cardinality", 1)
  73. // Class Post_Element {
  74. // label : String {
  75. // target_lower_cardinality = 1
  76. // target_upper_cardinality = 1
  77. // }
  78. // value : funcdef {
  79. // target_upper_cardinality = 1
  80. // }
  81. // action : funcdef {
  82. // target_upper_cardinality = 1
  83. // }
  84. // }
  85. instantiate_node(new_model, "Class", "Post_Element")
  86. instantiate_link(new_model, "Association", "Post_Element_label", "Post_Element", "String")
  87. instantiate_attribute(new_model, "Post_Element_label", "name", "label")
  88. instantiate_attribute(new_model, "Post_Element_label", "target_lower_cardinality", 1)
  89. instantiate_attribute(new_model, "Post_Element_label", "target_upper_cardinality", 1)
  90. instantiate_link(new_model, "Association", "Post_Element_value", "Post_Element", "funcdef")
  91. instantiate_attribute(new_model, "Post_Element_value", "name", "value")
  92. instantiate_attribute(new_model, "Post_Element_value", "target_upper_cardinality", 1)
  93. instantiate_link(new_model, "Association", "Post_Element_action", "Post_Element", "funcdef")
  94. instantiate_attribute(new_model, "Post_Element_action", "name", "action")
  95. instantiate_attribute(new_model, "Post_Element_action", "target_upper_cardinality", 1)
  96. // Association RHS_contains (RHS, Post_Element) {}
  97. instantiate_link(new_model, "Association", "RHS_contains", "RHS", "Post_Element")
  98. instantiate_attribute(new_model, "RHS_contains", "name", "contains")
  99. // Basics are added, now we need to add each node and transition, but slightly modified
  100. Element keys
  101. String key
  102. Element new_entry
  103. Element entry
  104. keys = dict_keys(old_m)
  105. String type_name
  106. String old_source
  107. String old_target
  108. Element to_link
  109. to_link = create_node()
  110. while (read_nr_out(keys) > 0):
  111. key = set_pop(keys)
  112. entry = old_m[key]
  113. type_name = reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], entry))
  114. if (type_name == "Class"):
  115. instantiate_node(new_model, type_name, "Pre_" + key)
  116. instantiate_node(new_model, type_name, "Post_" + key)
  117. // Also make it inherit from the "root element"
  118. instantiate_link(new_model, "Inheritance", "", "Pre_" + key, "Pre_Element")
  119. instantiate_link(new_model, "Inheritance", "", "Post_" + key, "Post_Element")
  120. elif (type_name == "Association"):
  121. old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
  122. old_target = reverseKeyLookup(model["model"], read_edge_dst(entry))
  123. instantiate_link(new_model, type_name, "Pre_" + key, "Pre_" + old_source, "Pre_" + old_target)
  124. instantiate_link(new_model, type_name, "Post_" + key, "Post_" + old_source, "Post_" + old_target)
  125. // 1) Make it inherit from the Root Element (Pre_Element or Post_Element)
  126. instantiate_link(new_model, "Inheritance", "", "Pre_" + key, "Pre_Element")
  127. instantiate_link(new_model, "Inheritance", "", "Post_" + key, "Post_Element")
  128. elif (type_name == "Inheritance"):
  129. old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
  130. old_target = reverseKeyLookup(model["model"], read_edge_dst(entry))
  131. instantiate_link(new_model, type_name, "Pre_" + key, "Pre_" + old_source, "Pre_" + old_target)
  132. instantiate_link(new_model, type_name, "Post_" + key, "Post_" + old_source, "Post_" + old_target)
  133. elif (bool_not(has_value(entry))):
  134. create_edge(to_link, entry)
  135. while (read_nr_out(to_link) > 0):
  136. entry = set_pop(to_link)
  137. type_name = reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], entry))
  138. // Primitive values themselves are not copied, so skip that here
  139. // An instance link, so just copy over (don't make element of Root Element), and don't even copy if it is lower cardinality
  140. // It is probably an attribute at the meta-language level, so check which one it is
  141. String name
  142. name = read_attribute(model["metamodel"], type_name, "name")
  143. if (bool_not(bool_or(bool_or(name == "lower_cardinality", name == "source_lower_cardinality"), bool_or(name == "constraint", name == "target_lower_cardinality")))):
  144. // Not a lower cardinality or constraint, so copy
  145. old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
  146. if (bool_or(bool_or(name == "name", name == "upper_cardinality"), bool_or(name == "source_upper_cardinality", name == "target_upper_cardinality"))):
  147. // Keep the old name for the physical attributes!
  148. instantiate_attribute(new_model, "Pre_" + old_source, name, read_edge_dst(entry))
  149. instantiate_attribute(new_model, "Post_" + old_source, name, read_edge_dst(entry))
  150. else:
  151. // Rename the attributes as well
  152. instantiate_attribute(new_model, "Pre_" + old_source, "Pre_" + name, read_edge_dst(entry))
  153. instantiate_attribute(new_model, "Post_" + old_source, "Post_" + name, read_edge_dst(entry))
  154. // Define schedule over these elements
  155. // Class Entry {}
  156. instantiate_node(new_model, "Class", "Entry")
  157. // Class Success : Entry {}
  158. instantiate_node(new_model, "Class", "Success")
  159. instantiate_link(new_model, "Inheritance", "", "Success", "Entry")
  160. // Class Failure : Entry {}
  161. instantiate_node(new_model, "Class", "Failure")
  162. instantiate_link(new_model, "Inheritance", "", "Failure", "Entry")
  163. // Class Rule : Entry {}
  164. instantiate_node(new_model, "Class", "Rule")
  165. instantiate_link(new_model, "Inheritance", "", "Rule", "Entry")
  166. // Association OnSuccess(Rule, Entry){
  167. // target_lower_cardinality = 1
  168. // target_upper_cardinality = 1
  169. // }
  170. instantiate_link(new_model, "Association", "OnSuccess", "Rule", "Entry")
  171. instantiate_attribute(new_model, "OnSuccess", "target_lower_cardinality", 1)
  172. instantiate_attribute(new_model, "OnSuccess", "target_upper_cardinality", 1)
  173. // Association OnFailure(Rule, Entry){
  174. // target_lower_cardinality = 1
  175. // target_upper_cardinality = 1
  176. // }
  177. instantiate_link(new_model, "Association", "OnFailure", "Rule", "Entry")
  178. instantiate_attribute(new_model, "OnFailure", "target_lower_cardinality", 1)
  179. instantiate_attribute(new_model, "OnFailure", "target_upper_cardinality", 1)
  180. // Class Query : Rule {}
  181. instantiate_node(new_model, "Class", "Query")
  182. instantiate_link(new_model, "Inheritance", "", "Query", "Rule")
  183. // Association QueryLHS (Query, LHS) {
  184. // target_lower_cardinality = 1
  185. // target_upper_cardinality = 1
  186. // }
  187. instantiate_link(new_model, "Association", "QueryLHS", "Query", "LHS")
  188. instantiate_attribute(new_model, "QueryLHS", "target_lower_cardinality", 1)
  189. instantiate_attribute(new_model, "QueryLHS", "target_upper_cardinality", 1)
  190. // Class Atomic : Rule {}
  191. instantiate_node(new_model, "Class", "Atomic")
  192. instantiate_link(new_model, "Inheritance", "", "Atomic", "Rule")
  193. // Association AtomicLHS (Atomic, LHS) {
  194. // target_lower_cardinality = 1
  195. // target_upper_cardinality = 1
  196. // }
  197. instantiate_link(new_model, "Association", "AtomicLHS", "Atomic", "LHS")
  198. instantiate_attribute(new_model, "AtomicLHS", "target_lower_cardinality", 1)
  199. instantiate_attribute(new_model, "AtomicLHS", "target_upper_cardinality", 1)
  200. // Association AtomicRHS (Atomic, RHS) {
  201. // target_lower_cardinality = 1
  202. // target_upper_cardinality = 1
  203. // }
  204. instantiate_link(new_model, "Association", "AtomicRHS", "Atomic", "RHS")
  205. instantiate_attribute(new_model, "AtomicRHS", "target_lower_cardinality", 1)
  206. instantiate_attribute(new_model, "AtomicRHS", "target_upper_cardinality", 1)
  207. // Class Composite : Rule {}
  208. instantiate_node(new_model, "Class", "Composite")
  209. instantiate_link(new_model, "Inheritance", "", "Composite", "Rule")
  210. // Association Initial(Composite, Entry){
  211. // target_lower_cardinality = 1
  212. // target_upper_cardinality = 1
  213. // }
  214. instantiate_link(new_model, "Association", "Initial", "Composite", "Entry")
  215. instantiate_attribute(new_model, "Initial", "target_lower_cardinality", 1)
  216. instantiate_attribute(new_model, "Initial", "target_upper_cardinality", 1)
  217. // Association Contains(Composite, Entry){
  218. // source_upper_cardinality = 1
  219. // target_lower_cardinality = 1
  220. // }
  221. instantiate_link(new_model, "Association", "Contains", "Composite", "Entry")
  222. instantiate_attribute(new_model, "Contains", "source_upper_cardinality", 1)
  223. instantiate_attribute(new_model, "Contains", "target_lower_cardinality", 1)
  224. return new_model!