|
@@ -0,0 +1,64 @@
|
|
|
+from visitor import Visitor
|
|
|
+
|
|
|
+def jsonstr(s):
|
|
|
+ return '"%s"' % s
|
|
|
+
|
|
|
+class ModelVisitor(Visitor):
|
|
|
+ def __init__(self, args):
|
|
|
+ Visitor.__init__(self, args)
|
|
|
+ self.constructors = []
|
|
|
+ self.free_id = 0
|
|
|
+ self.name_maps = {}
|
|
|
+ self.current_model = None
|
|
|
+ self.current_element = None
|
|
|
+
|
|
|
+ def dump(self):
|
|
|
+ return self.constructors
|
|
|
+
|
|
|
+ def visit_start(self, tree):
|
|
|
+ for t in tree.get_tail():
|
|
|
+ self.visit(t)
|
|
|
+
|
|
|
+ def visit_import(self, tree):
|
|
|
+ url = tree.get_children("MV_URL")[0]
|
|
|
+ target = tree.get_children("MODEL_ID")[0]
|
|
|
+ self.constructors.extend(['"import_node"', jsonstr(url.get_text()), jsonstr(target.get_text())])
|
|
|
+
|
|
|
+ def visit_model(self, tree):
|
|
|
+ children = tree.get_children("MODEL_ID")
|
|
|
+ model_type = children[0].get_text()
|
|
|
+ model_name = children[1].get_text()
|
|
|
+ self.constructors.extend(['"instantiate_model"', jsonstr(model_type), jsonstr(model_name)])
|
|
|
+ self.current_model = model_name
|
|
|
+ for element in tree.get_children("model_element"):
|
|
|
+ self.visit(element)
|
|
|
+
|
|
|
+ def visit_model_element(self, tree):
|
|
|
+ children = tree.get_children("MODEL_ID")
|
|
|
+ element_type = children[0].get_text()
|
|
|
+ element_name = children[1].get_text()
|
|
|
+
|
|
|
+ if len(children) == 4:
|
|
|
+ source_name = children[2].get_text()
|
|
|
+ target_name = children[3].get_text()
|
|
|
+ self.constructors.extend(['"instantiate_link"', jsonstr(self.current_model), jsonstr(element_type), jsonstr(element_name), jsonstr(source_name), jsonstr(target_name)])
|
|
|
+ else:
|
|
|
+ self.constructors.extend(['"instantiate_node"', jsonstr(self.current_model), jsonstr(element_type), jsonstr(element_name)])
|
|
|
+ self.current_element = element_name
|
|
|
+
|
|
|
+ for attr in tree.get_children("model_attribute"):
|
|
|
+ self.visit(attr)
|
|
|
+
|
|
|
+ def visit_model_attribute(self, tree):
|
|
|
+ children = tree.get_children("MODEL_ID")
|
|
|
+ is_definition = bool(tree.get_children("COLON"))
|
|
|
+
|
|
|
+ if is_definition:
|
|
|
+ attr_name = children[0].get_text()
|
|
|
+ attr_type = children[1].get_text()
|
|
|
+ self.constructors.extend(['"instantiate_link"', jsonstr("Association"), jsonstr(self.current_element + "_" + attr_name), jsonstr(self.current_element), jsonstr(attr_type)])
|
|
|
+ self.constructors.extend(['"instantiate_attribute"', jsonstr(self.current_element + "_" + attr_name), jsonstr("name"), jsonstr(attr_name)])
|
|
|
+ else:
|
|
|
+ attr_name = children[0].get_text()
|
|
|
+ attr_value = children[1]
|
|
|
+ self.constructors.extend(['"instantiate_attribute"', jsonstr(self.current_element), jsonstr(attr_name), jsonstr(attr_value.get_text()) if attr_value.head == "STRVALUE" else attr_value.get_text()])
|