Bläddra i källkod

Add inheritance link between links in AL MM

Yentl Van Tendeloo 9 år sedan
förälder
incheckning
8a367b1745

+ 63 - 40
bootstrap/metamodels.alc

@@ -257,48 +257,71 @@ Element function initialize_SCD(location : String):
 	instantiate_link(scd, "Association", "call_func", "call", "Expression")
 	instantiate_link(scd, "Association", "call_params", "call", "param")
 	instantiate_link(scd, "Association", "call_last_param", "call", "param")
+	instantiate_link(scd, "Inheritance", "", "statement_next", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "if_cond", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "if_true", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "if_false", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "while_cond", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "while_body", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "assign_var", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "assign_value", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "break_while", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "continue_while", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "return_value", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "resolve_var", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "access_var", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "constant_node", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "output_node", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "global_var", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "param_name", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "param_value", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "param_next_param", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "funcdef_body", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "call_func", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "call_params", "dict_link")
+	instantiate_link(scd, "Inheritance", "", "call_last_param", "dict_link")
 
 	// Add cardinalities on how many connections are allowed: one of each
-	//instantiate_attribute(scd, "statement_next", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "if_cond", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "if_cond", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "if_true", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "if_true", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "if_false", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "while_cond", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "while_cond", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "while_body", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "while_body", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "assign_var", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "assign_var", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "assign_value", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "assign_value", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "break_while", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "break_while", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "continue_while", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "continue_while", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "return_value", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "resolve_var", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "resolve_var", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "access_var", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "access_var", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "constant_node", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "constant_node", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "output_node", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "output_node", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "global_var", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "global_var", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "param_name", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "param_name", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "param_value", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "param_value", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "param_next_param", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "funcdef_body", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "funcdef_body", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "call_func", "target_lower_cardinality", 1)
-	//instantiate_attribute(scd, "call_func", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "call_params", "target_upper_cardinality", 1)
-	//instantiate_attribute(scd, "call_last_param", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "statement_next", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "if_cond", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "if_cond", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "if_true", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "if_true", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "if_false", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "while_cond", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "while_cond", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "while_body", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "while_body", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "assign_var", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "assign_var", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "assign_value", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "assign_value", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "break_while", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "break_while", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "continue_while", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "continue_while", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "return_value", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "resolve_var", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "resolve_var", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "access_var", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "access_var", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "constant_node", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "constant_node", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "output_node", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "output_node", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "global_var", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "global_var", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "param_name", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "param_name", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "param_value", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "param_value", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "param_next_param", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "funcdef_body", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "funcdef_body", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "call_func", "target_lower_cardinality", 1)
+	instantiate_attribute(scd, "call_func", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "call_params", "target_upper_cardinality", 1)
+	instantiate_attribute(scd, "call_last_param", "target_upper_cardinality", 1)
 
 	// Add constraints to all primitive classes
 	//add_constraint(scd, "if", constraint_if)

+ 31 - 31
bootstrap/modelling.alc

@@ -243,7 +243,7 @@ Void function unset_attribute(model : Element, element : String, attribute : Str
 
 	return
 
-Void function add_AL_links(model : Element, list : Element, element : Element, linkname : String, expected_type : String):
+Void function add_AL_links(model : Element, list : Element, element : Element, type: String, linkname : String, expected_type : String):
 	if (bool_not(dict_in(element, linkname))):
 		return
 
@@ -252,7 +252,7 @@ Void function add_AL_links(model : Element, list : Element, element : Element, l
 
 	// The link
 	dict_add(model["model"], "__" + cast_id2s(link), link)
-	dict_add(model["type_mapping"], link, model["metamodel"]["model"]["dict_link"])
+	dict_add(model["type_mapping"], link, model["metamodel"]["model"][(type + "_") + linkname])
 
 	// The name link
 	link = read_out(link, 0)
@@ -306,48 +306,48 @@ String function add_AL(model : Element, element : Element):
 
 			// Now add its edges
 			if (type == "if"):
-				add_AL_links(model, todo, elem, "cond", "")
-				add_AL_links(model, todo, elem, "true", "")
-				add_AL_links(model, todo, elem, "false", "")
-				add_AL_links(model, todo, elem, "next", "")
+				add_AL_links(model, todo, elem, type, "cond", "")
+				add_AL_links(model, todo, elem, type, "true", "")
+				add_AL_links(model, todo, elem, type, "false", "")
+				add_AL_links(model, todo, elem, type, "next", "")
 			elif (type == "while"):
-				add_AL_links(model, todo, elem, "cond", "")
-				add_AL_links(model, todo, elem, "body", "")
-				add_AL_links(model, todo, elem, "next", "")
+				add_AL_links(model, todo, elem, type, "cond", "")
+				add_AL_links(model, todo, elem, type, "body", "")
+				add_AL_links(model, todo, elem, type, "next", "")
 			elif (type == "assign"):
-				add_AL_links(model, todo, elem, "var", "")
-				add_AL_links(model, todo, elem, "value", "")
-				add_AL_links(model, todo, elem, "next", "")
+				add_AL_links(model, todo, elem, type, "var", "")
+				add_AL_links(model, todo, elem, type, "value", "")
+				add_AL_links(model, todo, elem, type, "next", "")
 			elif (type == "break"):
-				add_AL_links(model, todo, elem, "while", "while")
+				add_AL_links(model, todo, elem, type, "while", "while")
 			elif (type == "continue"):
-				add_AL_links(model, todo, elem, "while", "while")
+				add_AL_links(model, todo, elem, type, "while", "while")
 			elif (type == "return"):
-				add_AL_links(model, todo, elem, "value", "")
+				add_AL_links(model, todo, elem, type, "value", "")
 			elif (type == "resolve"):
-				add_AL_links(model, todo, elem, "var", "")
+				add_AL_links(model, todo, elem, type, "var", "")
 			elif (type == "access"):
-				add_AL_links(model, todo, elem, "var", "")
+				add_AL_links(model, todo, elem, type, "var", "")
 			elif (type == "constant"):
-				add_AL_links(model, todo, elem, "node", "")
+				add_AL_links(model, todo, elem, type, "node", "")
 			elif (type == "output"):
-				add_AL_links(model, todo, elem, "node", "")
-				add_AL_links(model, todo, elem, "next", "")
+				add_AL_links(model, todo, elem, type, "node", "")
+				add_AL_links(model, todo, elem, type, "next", "")
 			elif (type == "global"):
-				add_AL_links(model, todo, elem, "var", "String")
-				add_AL_links(model, todo, elem, "next", "")
+				add_AL_links(model, todo, elem, type, "var", "String")
+				add_AL_links(model, todo, elem, type, "next", "")
 			elif (type == "param"):
-				add_AL_links(model, todo, elem, "name", "String")
-				add_AL_links(model, todo, elem, "value", "")
-				add_AL_links(model, todo, elem, "next_param", "param")
+				add_AL_links(model, todo, elem, type, "name", "String")
+				add_AL_links(model, todo, elem, type, "value", "")
+				add_AL_links(model, todo, elem, type, "next_param", "param")
 			elif (type == "funcdef"):
-				add_AL_links(model, todo, elem, "body", "")
-				add_AL_links(model, todo, elem, "next", "")
+				add_AL_links(model, todo, elem, type, "body", "")
+				add_AL_links(model, todo, elem, type, "next", "")
 			elif (type == "call"):
-				add_AL_links(model, todo, elem, "func", "")
-				add_AL_links(model, todo, elem, "params", "param")
-				add_AL_links(model, todo, elem, "last_param", "param")
-				add_AL_links(model, todo, elem, "next", "")
+				add_AL_links(model, todo, elem, type, "func", "")
+				add_AL_links(model, todo, elem, type, "params", "param")
+				add_AL_links(model, todo, elem, type, "last_param", "param")
+				add_AL_links(model, todo, elem, type, "next", "")
 
 	return reverseKeyLookup(model["model"], element)
 

+ 43 - 34
bootstrap/object_operations.alc

@@ -17,10 +17,8 @@ Element function allInstances(model : Element, type_name : String):
 	while (0 < list_len(keys)):
 		key = set_pop(keys)
 		if (is_nominal_instance(model, key, type_name)):
-			log("Found instance of " + type_name)
 			set_add(result, key)
 
-	log("Finished searching for instances")
 	return result
 
 Element function selectPossibleIncoming(model : Element, target : String, limit_set : Element):
@@ -28,20 +26,19 @@ Element function selectPossibleIncoming(model : Element, target : String, limit_
 	// Should also include those specified on the superclass(es)
 
 	String type
-	Element metamodel_dict
+	Element model_dict
 	Element elem
 	Element result
 	Element target_element
 
 	result = create_node()
-	metamodel_dict = model["metamodel"]["model"]
-	target_element = model["model"][target]
+	model_dict = model["model"]
 
 	while (0 < list_len(limit_set)):
 		type = set_pop(limit_set)
-		elem = metamodel_dict[type]
+		elem = model_dict[type]
 		if (is_edge(elem)):
-			if (is_nominal_instance(model, target, reverseKeyLookup(metamodel_dict, read_edge_dst(elem)))):
+			if (is_nominal_subtype(model, target, reverseKeyLookup(model_dict, read_edge_dst(elem)))):
 				set_add(result, type)
 	
 	return result
@@ -50,57 +47,69 @@ Element function selectPossibleOutgoing(model : Element, source : String, limit_
 	// Find all possible outgoing link types for the source model
 	// Should also include those specified on the superclass(es)
 	String type
-	Element metamodel_dict
+	Element model_dict
 	Element elem
 	Element result
 	Element source_element
 
 	result = create_node()
-	metamodel_dict = model["metamodel"]["model"]
-	source_element = model["model"][source]
+	model_dict = model["model"]
 	
 	while (0 < list_len(limit_set)):
 		type = set_pop(limit_set)
-		elem = metamodel_dict[type]
+		elem = model_dict[type]
 		if (is_edge(elem)):
-			if (is_nominal_instance(model, source, reverseKeyLookup(metamodel_dict, read_edge_src(elem)))):
+			if (is_nominal_subtype(model, source, reverseKeyLookup(model_dict, read_edge_src(elem)))):
 				set_add(result, type)
 	
 	return result
 
 Element function allOutgoingAssociationInstances(model : Element, source_name : String, assoc_name : String):
 	// Read out all outgoing edges of the model and select those that are typed by the specified association
-	// TODO for some reason this crashes if allInstances is used!
-	Element assocs
-	String assoc
+	Integer nr_out
+	Integer i
+	Element out
+	String out_name
 	Element result
-	Element source
-
-	assocs = allInstances(model, assoc_name)
-	source = model["model"][source_name]
 
 	result = create_node()
-	while (0 < list_len(assocs)):
-		assoc = set_pop(assocs)
-		if (element_eq(source, read_edge_src(model["model"][assoc]))):
-			set_add(result, assoc)
+	nr_out = read_nr_out(model["model"][source_name])
+	i = 0
+
+	log("Searching for instances of " + assoc_name)
+	log("  starting from " + source_name)
+	while (i < nr_out):
+		out = read_out(model["model"][source_name], i)
+		if (set_in_node(model["model"], out)):
+			out_name = reverseKeyLookup(model["model"], out)
+			log("     checking " + out_name)
+			log("        typed by: " + reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], out)))
+			if (is_nominal_instance(model, out_name, assoc_name)):
+				set_add(result, out_name)
+		else:
+			log("     skipping link typed by: " + reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], out)))
+		i = i + 1
+
 	return result
 
 Element function allIncomingAssociationInstances(model : Element, target_name : String, assoc_name : String):
 	// Read out all outgoing edges of the model and select those that are typed by the specified association
-	Element assocs
-	String assoc
+	Integer nr_in
+	Integer i
+	Element in
+	String in_name
 	Element result
-	Element target
-
-	assocs = allInstances(model, assoc_name)
-	target = model["model"][target_name]
-
 	result = create_node()
-	while (0 < list_len(assocs)):
-		assoc = set_pop(assocs)
-		if (element_eq(target, read_edge_dst(model["model"][assoc]))):
-			set_add(result, assoc)
+	nr_in = read_nr_in(model["model"][target_name])
+	i = 0
+	while (i < nr_in):
+		in = read_in(model["model"][target_name], i)
+		if (set_in_node(model["model"], in)):
+			in_name = reverseKeyLookup(model["model"], in)
+			if (is_nominal_instance(model, in_name, assoc_name)):
+				set_add(result, in_name)
+		i = i + 1
+
 	return result
 
 Element function getAttributeList(model : Element, element : String):

+ 1 - 0
interface/HUTN/includes/conformance_scd.alh

@@ -1,5 +1,6 @@
 Boolean function is_direct_instance(model: Element, instance: String, type: String)
 Boolean function is_nominal_instance(model: Element, instance: String, type: String)
+Boolean function is_nominal_subtype(metamodel : Element, subclass : String, superclass : String)
 Element function conformance_scd(model: Element)
 Element function set_model_constraints(model: Element, func: Element)
 Element function generate_bottom_type_mapping(model: Element)

+ 1 - 1
state/modelverse_state/main.py

@@ -214,7 +214,7 @@ class ModelverseState(object):
 
     def read_dict_edge(self, node, value):
         try:
-            first = self.cache[node][value]
+            first = self.cache[node][str(value)]
             # Got hit, so validate
             if (self.edges[first][0] == node) and \
                 (len(self.outgoing[first]) == 1) and \