]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/translation/GraphTranslator.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.graph.compiler / src / org / simantics / graph / compiler / internal / translation / GraphTranslator.java
diff --git a/bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/translation/GraphTranslator.java b/bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/translation/GraphTranslator.java
new file mode 100644 (file)
index 0000000..71ff4c3
--- /dev/null
@@ -0,0 +1,295 @@
+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