ramify.alc 6.3 KB

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