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