ramify.alc 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. include "primitives.alh"
  2. include "object_operations.alh"
  3. include "modelling.alh"
  4. include "metamodels.alh"
  5. Element function ramify_func(model : Element, prepost : String):
  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, "metamodel", model["metamodel"])
  11. dict_add(new_model, "inheritance", model["inheritance"])
  12. log("Copied basic data")
  13. // Get local variables for parts
  14. Element old_m
  15. Element new_m
  16. Element mm
  17. String inheritor
  18. new_m = new_model["model"]
  19. old_m = new_model["model"]
  20. mm = new_model["metamodel"]["model"]
  21. Boolean is_pre
  22. is_pre = prepost == "pre"
  23. // Add in Natural and String
  24. log("Adding Natural and String")
  25. instantiate_node(new_model, "Class", "Natural")
  26. instantiate_node(new_model, "Class", "String")
  27. // Add in the complete AL metamodel
  28. //TODO this is broken right now because of the use of Any in the AL MM
  29. //add_AL_to_MM(new_model)
  30. //TODO temporarily add them like this
  31. instantiate_node(new_model, "Class", "Expression")
  32. instantiate_node(new_model, "Class", "FuncDef")
  33. log("Adding default elements")
  34. // Add some default elements
  35. if (is_pre):
  36. // Class LHS {
  37. // constraint : Expression {
  38. // target_upper_cardinality = 1
  39. // }
  40. // upper_cardinality = 1
  41. // lower_cardinality = 1
  42. // }
  43. instantiate_node(new_model, "Class", "LHS")
  44. instantiate_attribute(new_model, "LHS", "lower_cardinality", 1)
  45. instantiate_attribute(new_model, "LHS", "upper_cardinality", 1)
  46. instantiate_link(new_model, "Association", "LHS_constraint", "LHS", "Expression")
  47. instantiate_attribute(new_model, "LHS_constraint", "name", "constraint")
  48. instantiate_attribute(new_model, "LHS_constraint", "target_upper_cardinality", 1)
  49. log("LHS OK")
  50. // Class NAC {}
  51. instantiate_node(new_model, "Class", "NAC")
  52. log("NAC OK")
  53. // Class Pre_Element {
  54. // label : String {
  55. // target_lower_cardinality = 1
  56. // target_upper_cardinality = 1
  57. // }
  58. // constraint : Expression {
  59. // target_upper_cardinality = 1
  60. // }
  61. // }
  62. instantiate_node(new_model, "Class", "Pre_Element")
  63. instantiate_link(new_model, "Association", "Pre_Element_label", "Pre_Element", "String")
  64. instantiate_attribute(new_model, "Pre_Element_label", "name", "label")
  65. instantiate_attribute(new_model, "Pre_Element_label", "target_lower_cardinality", 1)
  66. instantiate_attribute(new_model, "Pre_Element_label", "target_upper_cardinality", 1)
  67. instantiate_link(new_model, "Association", "Pre_Element_constraint", "Pre_Element", "Expression")
  68. instantiate_attribute(new_model, "Pre_Element_constraint", "name", "constraint")
  69. instantiate_attribute(new_model, "Pre_Element_constraint", "target_upper_cardinality", 1)
  70. log("Pre_Element OK")
  71. // Association LHS_contains (LHS, Pre_Element) {}
  72. instantiate_link(new_model, "Association", "LHS_contains", "LHS", "Pre_Element")
  73. instantiate_attribute(new_model, "LHS_contains", "name", "contains")
  74. log("LHS_contains OK")
  75. // Association NAC_contains (NAC, Pre_Element) {}
  76. instantiate_link(new_model, "Association", "NAC_contains", "NAC", "Pre_Element")
  77. instantiate_attribute(new_model, "NAC_contains", "name", "contains")
  78. log("NAC_contains OK")
  79. inheritor = "Pre_Element"
  80. else:
  81. // Class RHS {
  82. // action : FuncDef {
  83. // target_upper_cardinality = 1
  84. // }
  85. // upper_cardinality = 1
  86. // lower_cardinality = 1
  87. // }
  88. instantiate_node(new_model, "Class", "RHS")
  89. instantiate_attribute(new_model, "RHS", "lower_cardinality", 1)
  90. instantiate_attribute(new_model, "RHS", "upper_cardinality", 1)
  91. instantiate_link(new_model, "Association", "RHS_action", "RHS", "FuncDef")
  92. instantiate_attribute(new_model, "RHS_action", "name", "action")
  93. instantiate_attribute(new_model, "RHS_action", "target_upper_cardinality", 1)
  94. log("RHS OK")
  95. // Class Post_Element {
  96. // label : String {
  97. // target_lower_cardinality = 1
  98. // target_upper_cardinality = 1
  99. // }
  100. // value : Expression {
  101. // target_upper_cardinality = 1
  102. // }
  103. // }
  104. instantiate_node(new_model, "Class", "Post_Element")
  105. instantiate_link(new_model, "Association", "Post_Element_label", "Post_Element", "String")
  106. instantiate_attribute(new_model, "Post_Element_label", "name", "label")
  107. instantiate_attribute(new_model, "Post_Element_label", "target_lower_cardinality", 1)
  108. instantiate_attribute(new_model, "Post_Element_label", "target_upper_cardinality", 1)
  109. instantiate_link(new_model, "Association", "Post_Element_value", "Post_Element", "Expression")
  110. instantiate_attribute(new_model, "Post_Element_value", "name", "value")
  111. instantiate_attribute(new_model, "Post_Element_value", "target_upper_cardinality", 1)
  112. log("Post_Element OK")
  113. // Association RHS_contains (RHS, Post_Element) {}
  114. instantiate_link(new_model, "Association", "RHS_contains", "RHS", "Post_Element")
  115. instantiate_attribute(new_model, "RHS_contains", "name", "contains")
  116. log("RHS_contains OK")
  117. inheritor = "Post_Element"
  118. // Basics are added, now we need to add each node and transition, but slightly modified
  119. Element keys
  120. String key
  121. Element new_entry
  122. Element entry
  123. String append
  124. if (is_pre):
  125. append = "Pre_"
  126. else:
  127. append = "Post_"
  128. keys = dict_keys(old_m)
  129. String type_name
  130. String old_source
  131. String old_target
  132. log("Iterate!")
  133. while (read_nr_out(keys) > 0):
  134. key = set_pop(keys)
  135. entry = old_m[key]
  136. log("Try " + key)
  137. type_name = reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], entry))
  138. if (type_name == "Class"):
  139. log("Class")
  140. instantiate_node(new_model, type_name, append + key)
  141. elif (type_name == "Association"):
  142. log("Association")
  143. old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
  144. old_target = reverseKeyLookup(model["model"], read_edge_dst(entry))
  145. instantiate_link(new_model, type_name, append + key, append + old_source, append + old_target)
  146. // 1) Make it inherit from the Root Element (Pre_Element or Post_Element)
  147. instantiate_link(new_model, "Inheritance", "", append + key, inheritor)
  148. elif (type_name == "Inheritance"):
  149. log("Inheritance")
  150. old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
  151. old_target = reverseKeyLookup(model["model"], read_edge_dst(entry))
  152. instantiate_link(new_model, type_name, append + key, append + old_source, append + old_target)
  153. elif (bool_not(has_value(entry))):
  154. log("Attribute")
  155. // Primitive values themselves are not copied, so skip that here
  156. // An instance link, so just copy over (don't make element of Root Element), and don't even copy if it is lower cardinality
  157. // It is probably an attribute at the meta-language level, so check which one it is
  158. String name
  159. name = cast_v2s(read_attribute(model["metamodel"], type_name, "name"))
  160. if (bool_not(bool_or(bool_or(name == "lower_cardinality", name == "source_lower_cardinality"), name == "target_lower_cardinality"))):
  161. // Not a lower cardinality, so copy
  162. old_source = reverseKeyLookup(model["model"], read_edge_src(entry))
  163. instantiate_attribute(new_model, append + old_source, append + name, read_edge_dst(entry))
  164. log("Finished")
  165. return new_model!
  166. Element function ramify(model : Element):
  167. Element rv
  168. rv = create_node()
  169. // Create Pre part
  170. log("PRE")
  171. dict_add(rv, "pre", ramify_func(model, "Pre"))
  172. // Create Post part
  173. log("POST")
  174. dict_add(rv, "post", ramify_func(model, "Post"))
  175. log("FINISHED")
  176. return rv!