--- /dev/null
+package org.simantics.graph.compiler.internal.translation;\r
+\r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+\r
+import org.antlr.runtime.tree.Tree;\r
+import org.simantics.graph.compiler.SourceInfo.DefinitionPosition;\r
+import org.simantics.graph.compiler.internal.parsing.GraphParser;\r
+import org.simantics.graph.compiler.internal.store.LocationStore;\r
+import org.simantics.graph.compiler.internal.store.PreValueStore;\r
+import org.simantics.graph.compiler.internal.templates.TemplateDefinition;\r
+import org.simantics.graph.compiler.internal.templates.TemplateDefinitionStore;\r
+import org.simantics.graph.compiler.internal.templates.TemplateInstanceStore;\r
+import org.simantics.graph.compiler.internal.values.TreeValue;\r
+import org.simantics.graph.query.Paths;\r
+import org.simantics.graph.query.UriUtils;\r
+import org.simantics.graph.store.GraphStore;\r
+import org.simantics.ltk.ISource;\r
+import org.simantics.ltk.Problem;\r
+import org.simantics.ltk.antlr.ANTLRUtils;\r
+\r
+public class GraphTranslator extends GraphStore {\r
+\r
+ ISource source;\r
+ Collection<Problem> problems;\r
+ \r
+ TObjectIntHashMap<String> variables = new TObjectIntHashMap<String>();\r
+ ArrayList<DefinitionPosition> definitionPositions = new ArrayList<DefinitionPosition>();\r
+ TIntHashSet definedResources = new TIntHashSet();\r
+ \r
+ LocationStore locations;\r
+ TemplateInstanceStore templateInstances;\r
+ TemplateDefinitionStore templateDefinitions;\r
+ PreValueStore preValues;\r
+ \r
+ Paths paths;\r
+ int layer0;\r
+ \r
+ public GraphTranslator(Paths paths, Collection<Problem> problems, GraphStore store) {\r
+ super(store); \r
+ this.problems = problems;\r
+ this.paths = paths;\r
+ \r
+ locations = getStore(LocationStore.class);\r
+ if(locations == null) {\r
+ locations = new LocationStore();\r
+ addStore(LocationStore.class, locations);\r
+ }\r
+ \r
+ templateInstances = getStore(TemplateInstanceStore.class);\r
+ if(templateInstances == null) {\r
+ templateInstances = new TemplateInstanceStore();\r
+ addStore(TemplateInstanceStore.class, templateInstances);\r
+ }\r
+ \r
+ templateDefinitions = getStore(TemplateDefinitionStore.class);\r
+ if(templateDefinitions == null) {\r
+ templateDefinitions = new TemplateDefinitionStore();\r
+ addStore(TemplateDefinitionStore.class, templateDefinitions);\r
+ }\r
+ \r
+ preValues = getStore(PreValueStore.class);\r
+ if(preValues == null) {\r
+ preValues = new PreValueStore();\r
+ addStore(PreValueStore.class, preValues);\r
+ }\r
+ \r
+ layer0 = identities.createPathToId(paths.Layer0); \r
+ }\r
+ \r
+ public void setSource(ISource source) {\r
+ this.source = source;\r
+ }\r
+ \r
+ public void translateGraph(Tree tree) { \r
+ int count = tree.getChildCount();\r
+ for(int i=0;i<count;++i)\r
+ translateResourceDefinition(tree.getChild(i));\r
+ }\r
+\r
+ protected void locate(int resource, Tree tree) {\r
+ locations.add(resource, ANTLRUtils.location(source, tree));\r
+ }\r
+ \r
+ public int translateResourceDefinition(Tree tree) {\r
+ Tree subjectTree = tree.getChild(0);\r
+ int subject = translateResource(subjectTree);\r
+ \r
+ int count = tree.getChildCount();\r
+ for(int i=1;i<count;++i) {\r
+ Tree child = tree.getChild(i);\r
+ switch(child.getType()) {\r
+ case GraphParser.PROPERTY:\r
+ translateProperty(subject, subjectTree, child);\r
+ break;\r
+ case GraphParser.TEMPLATE_INSTANCE:\r
+ translateTemplateInstance(subject, child);\r
+ break;\r
+ case GraphParser.TEMPLATE_DEFINITION:\r
+ translateTemplateDefinition(subject, child);\r
+ break;\r
+ }\r
+ }\r
+ return subject;\r
+ }\r
+\r
+ private void translateProperty(int subject, Tree subjectTree, Tree tree) {\r
+ int predicate = translateResource(tree.getChild(0));\r
+ if(predicate == instanceOfId || predicate == inheritsId || predicate == subrelationOfId)\r
+ if(definedResources.add(subject)) { \r
+ definitionPositions.add(new DefinitionPosition(subject,\r
+ ANTLRUtils.getStartLine(subjectTree) + source.startLine(),\r
+ ANTLRUtils.getStartIndex(subjectTree) + source.startPos(),\r
+ ANTLRUtils.getStopIndex(subjectTree) + source.startPos()\r
+ ));\r
+ }\r
+ int count = tree.getChildCount();\r
+ for(int i=1;i<count;++i) {\r
+ int object = translateResourceDefinition(tree.getChild(i));\r
+ statements.add(subject, predicate, object);\r
+ }\r
+ } \r
+ \r
+ private void translateTemplateInstance(int subject, Tree tree) {\r
+ int parameterCount = tree.getChildCount();\r
+ int[] templateInstance = new int[parameterCount+1];\r
+ templateInstance[0] = translateResource(tree.getChild(0));\r
+ templateInstance[1] = subject;\r
+ for(int i=1;i<parameterCount;++i) {\r
+ Tree child = tree.getChild(i);\r
+ if(child.getType() == GraphParser.RESOURCE)\r
+ templateInstance[i+1] = translateResourceDefinition(child);\r
+ else\r
+ templateInstance[i+1] = translateResource(child);\r
+ }\r
+ templateInstances.add(templateInstance);\r
+ } \r
+ \r
+ private void translateTemplateDefinition(int subject, Tree tree) {\r
+ ArrayList<String> parameters = new ArrayList<String>(); \r
+\r
+ int i=0;\r
+ while(i < tree.getChildCount() && \r
+ tree.getChild(i).getType() == GraphParser.VARIABLE) {\r
+ parameters.add(tree.getChild(i).getChild(0).getText());\r
+ ++i;\r
+ }\r
+\r
+ GraphStore store = new GraphStore();\r
+ ChildGraphTranslator translator = new ChildGraphTranslator(this, store);\r
+ translator.setSource(source);\r
+ while(i < tree.getChildCount()) {\r
+ translator.translateResourceDefinition(tree.getChild(i));\r
+ ++i;\r
+ } \r
+ \r
+ templateDefinitions.add(subject, \r
+ new TemplateDefinition(parameters.toArray(new String[parameters.size()]), \r
+ translator.correspondences.toArray(), \r
+ store));\r
+ }\r
+\r
+ public static void printTree(Tree tree) {\r
+ printTree(0, tree);\r
+ }\r
+ \r
+ int equalsId = 0;\r
+ int inheritsId = 0;\r
+ int subrelationOfId = 0;\r
+ int instanceOfId = 0;\r
+ int hasDomainId = 0;\r
+ int hasRangeId = 0;\r
+ int domainOfId = 0;\r
+ int requiresValueTypeId = 0;\r
+ int DatatypeId = 0;\r
+ \r
+ private int translateResource(Tree tree) {\r
+ switch(tree.getType()) {\r
+ case GraphParser.EMBEDDED_VALUE: {\r
+ int id = identities.newResource();\r
+ preValues.setValue(id, new TreeValue(source, tree.getChild(0)));\r
+ locate(id, tree.getChild(0));\r
+ return id;\r
+ }\r
+ case GraphParser.EMBEDDED_TYPE: {\r
+ int DataType = identities.newResource();\r
+ values.setValue(DataType, new DataTypeTranslator(source, problems).translate(tree.getChild(0)));\r
+ if(instanceOfId == 0)\r
+ instanceOfId = identities.getChild(layer0, "InstanceOf");\r
+ if(DatatypeId == 0)\r
+ DatatypeId = identities.getChild(layer0, "DataType");\r
+ statements.add(DataType, instanceOfId, DatatypeId);\r
+ locate(DataType, tree.getChild(0));\r
+ return DataType;\r
+ }\r
+ case GraphParser.BLANK: {\r
+ int id = identities.newResource();\r
+ locate(id, tree);\r
+ return id;\r
+ }\r
+ case GraphParser.ID:\r
+ return getVariable(tree, tree.getText());\r
+ case GraphParser.VARIABLE: {\r
+ int id = identities.getRoot(tree.getChild(0).getText());\r
+ locate(id, tree);\r
+ return id;\r
+ }\r
+ case GraphParser.URI: {\r
+ String uri = tree.getText();\r
+ uri = uri.substring(1, uri.length()-1);\r
+ int id = identities.createPathToId(UriUtils.uriToPath(uri));\r
+ locate(id, tree);\r
+ return id;\r
+ }\r
+ case GraphParser.REF: {\r
+ int parent = translateResource(tree.getChild(0));\r
+ Tree nameNode = tree.getChild(1);\r
+ String name = nameNode.getText();\r
+ if(nameNode.getType() == GraphParser.STRING) {\r
+ name = name.substring(1, name.length()-1);\r
+ }\r
+ int id = identities.getChild(parent, name);\r
+ locate(id, tree);\r
+ return id;\r
+ }\r
+ case GraphParser.EQUALS:\r
+ if(equalsId == 0)\r
+ equalsId = identities.getChild(layer0, "Equals");\r
+ return equalsId;\r
+ case GraphParser.INHERITS:\r
+ if(inheritsId == 0)\r
+ inheritsId = identities.getChild(layer0, "Inherits");\r
+ return inheritsId;\r
+ case GraphParser.SUBRELATION_OF:\r
+ if(subrelationOfId == 0)\r
+ subrelationOfId = identities.getChild(layer0, "SubrelationOf");\r
+ return subrelationOfId;\r
+ case GraphParser.INSTANCE_OF:\r
+ if(instanceOfId == 0)\r
+ instanceOfId = identities.getChild(layer0, "InstanceOf");\r
+ return instanceOfId; \r
+ case GraphParser.HAS_DOMAIN:\r
+ if(hasDomainId == 0)\r
+ hasDomainId = identities.getChild(layer0, "HasDomain");\r
+ return hasDomainId; \r
+ case GraphParser.HAS_RANGE:\r
+ if(hasRangeId == 0)\r
+ hasRangeId = identities.getChild(layer0, "HasRange");\r
+ return hasRangeId;\r
+ case GraphParser.DOMAIN_OF:\r
+ if(domainOfId == 0)\r
+ domainOfId = identities.getChild(layer0, "DomainOf");\r
+ return domainOfId; \r
+ case GraphParser.REQUIRES_VALUE_TYPE:\r
+ if(requiresValueTypeId == 0)\r
+ requiresValueTypeId = identities.getChild(layer0, "RequiresValueType");\r
+ return requiresValueTypeId; \r
+ default: \r
+ // TODO\r
+ System.out.println("-- " + GraphParser.tokenNames[tree.getType()]);\r
+ printTree(tree);\r
+ return 0;\r
+ } \r
+ }\r
+\r
+ public int getVariable(Tree place, String text) {\r
+ if(variables.containsKey(text))\r
+ return variables.get(text);\r
+ else {\r
+ int id = identities.newResource();\r
+ variables.put(text, id);\r
+ locate(id, place);\r
+ return id;\r
+ }\r
+ }\r
+ \r
+ public TObjectIntHashMap<String> getVariables() {\r
+ return variables;\r
+ }\r
+ \r
+ public ArrayList<DefinitionPosition> getDefinitionPositions() {\r
+ return definitionPositions;\r
+ }\r
+\r
+ public static void printTree(int indent, Tree tree) {\r
+ for(int i=0;i<indent;++i)\r
+ System.out.print(" ");\r
+ System.out.println(tree.getText());\r
+ for(int i=0;i<tree.getChildCount();++i)\r
+ printTree(indent+1, tree.getChild(i));\r
+ } \r
+}\r