|
@@ -0,0 +1,56 @@
|
|
|
+include "primitives.alh"
|
|
|
+include "modelling.alh"
|
|
|
+include "object_operations.alh"
|
|
|
+
|
|
|
+Boolean function main(model : Element):
|
|
|
+ String result
|
|
|
+ Element nodes
|
|
|
+ String node
|
|
|
+ Element edges
|
|
|
+ String edge
|
|
|
+ String new_node
|
|
|
+ String source
|
|
|
+ String destination
|
|
|
+ String name
|
|
|
+ Element to_explore
|
|
|
+ Element explored
|
|
|
+
|
|
|
+ result = "root, = yield [('RR', [])]\n"
|
|
|
+ nodes = allInstances(model, "Rules/Root")
|
|
|
+ while (set_len(nodes) > 0):
|
|
|
+ node = set_pop(nodes)
|
|
|
+ source = string_replace(node, "/", "_")
|
|
|
+ result = result + source + " = root\n"
|
|
|
+
|
|
|
+ // Keep following outgoing edges to find matching nodes
|
|
|
+ to_explore = set_create()
|
|
|
+ explored = set_create()
|
|
|
+ set_add(to_explore, node)
|
|
|
+
|
|
|
+ while (set_len(to_explore) > 0):
|
|
|
+ // Still explore more!
|
|
|
+ node = set_pop(to_explore)
|
|
|
+ source = string_replace(node, "/", "_")
|
|
|
+
|
|
|
+ edges = allOutgoingAssociationInstances(model, node, "Rules/Edge")
|
|
|
+ while (set_len(edges) > 0):
|
|
|
+ edge = set_pop(edges)
|
|
|
+ new_node = readAssociationDestination(model, edge)
|
|
|
+ if (value_eq(read_attribute(model, new_node, "match"), True)):
|
|
|
+ // Is a match node, so fetch the value on the edge
|
|
|
+ name = read_attribute(model, edge, "value")
|
|
|
+ destination = string_replace(new_node, "/", "_")
|
|
|
+ result = result + destination + ", = yield [('RD', [" + source + ", " + name + "])]\n"
|
|
|
+
|
|
|
+ String value
|
|
|
+ value = read_attribute(model, new_node, "value")
|
|
|
+ if (element_neq(value, read_root())):
|
|
|
+ // Match node has a value we should compare as well!
|
|
|
+ // Read out the value from the Modelverse
|
|
|
+ result = result + destination + "_V, = yield [('RV', [" + destination + "])]\n"
|
|
|
+
|
|
|
+ set_add(to_explore, new_node)
|
|
|
+
|
|
|
+ log("Got result:")
|
|
|
+ log(result)
|
|
|
+ return True!
|