X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.graph.compiler%2Fsrc%2Forg%2Fsimantics%2Fgraph%2Fcompiler%2Finternal%2Ftranslation%2FDataValueTranslator.java;fp=bundles%2Forg.simantics.graph.compiler%2Fsrc%2Forg%2Fsimantics%2Fgraph%2Fcompiler%2Finternal%2Ftranslation%2FDataValueTranslator.java;h=3eafe49accbf6e193a7d14c982fd3694bca9aa0c;hp=0000000000000000000000000000000000000000;hb=969bd23cab98a79ca9101af33334000879fb60c5;hpb=866dba5cd5a3929bbeae85991796acb212338a08 diff --git a/bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/translation/DataValueTranslator.java b/bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/translation/DataValueTranslator.java new file mode 100644 index 000000000..3eafe49ac --- /dev/null +++ b/bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/translation/DataValueTranslator.java @@ -0,0 +1,261 @@ +package org.simantics.graph.compiler.internal.translation; + +import java.util.Collection; + +import org.antlr.runtime.tree.Tree; +import org.simantics.databoard.Bindings; +import org.simantics.databoard.binding.ArrayBinding; +import org.simantics.databoard.binding.Binding; +import org.simantics.databoard.binding.BooleanBinding; +import org.simantics.databoard.binding.ByteBinding; +import org.simantics.databoard.binding.DoubleBinding; +import org.simantics.databoard.binding.FloatBinding; +import org.simantics.databoard.binding.IntegerBinding; +import org.simantics.databoard.binding.LongBinding; +import org.simantics.databoard.binding.MapBinding; +import org.simantics.databoard.binding.OptionalBinding; +import org.simantics.databoard.binding.RecordBinding; +import org.simantics.databoard.binding.StringBinding; +import org.simantics.databoard.binding.UnionBinding; +import org.simantics.databoard.binding.VariantBinding; +import org.simantics.databoard.binding.error.BindingException; +import org.simantics.databoard.type.Datatype; +import org.simantics.graph.compiler.internal.parsing.GraphParser; +import org.simantics.ltk.ISource; +import org.simantics.ltk.Problem; +import org.simantics.ltk.antlr.ANTLRUtils; + +public class DataValueTranslator { + + ISource source; + Collection problems; + + public DataValueTranslator(ISource source, Collection problems) { + this.source = source; + this.problems = problems; + } + + public Object translate(Tree _tree, Binding binding) { + while(_tree.getType() == GraphParser.TUPLE && + _tree.getChildCount()==1) + _tree = _tree.getChild(0); + final Tree tree = _tree; + return binding.accept(new Binding.Visitor() { + + @Override + public Object visit(ArrayBinding b) { + if(tree.getType() == GraphParser.ARRAY) { + int count = tree.getChildCount(); + Object[] components = new Object[count]; + Binding componentBinding = b.getComponentBinding(); + for(int i=0;i= 6) + return b.createUnchecked(str.substring(3, str.length()-3)); + else + return b.createUnchecked(str.substring(1, str.length()-1)); + } + typeError(tree, b); + return b.createDefaultUnchecked(); + } + + @Override + public Object visit(UnionBinding b) { + if(tree.getType() == GraphParser.TAGGED_VALUE) { + String tag = tree.getChild(0).getText(); + Integer comp = b.type().getComponentIndex(tag); + if(comp != null) { + if(tree.getChildCount() == 2) + return b.createUnchecked(comp, + translate( + tree.getChild(1), + b.getComponentBinding(comp) + )); + else { + Binding binding = b.getComponentBinding(comp); + if(binding instanceof RecordBinding && + ((RecordBinding)binding).getComponentCount() == 0) + return b.createUnchecked(comp, + ((RecordBinding)binding).createUnchecked()); + else + typeError(tree, binding); + } + } + } + typeError(tree, b); + return b.createDefaultUnchecked(); + } + + @Override + public Object visit(VariantBinding b) { + if(tree.getType() == GraphParser.VARIANT) { + Datatype type = + new DataTypeTranslator(source, problems).translate(tree.getChild(0)); + Binding binding = Bindings.getBinding(type); + + Object value = translate(tree.getChild(1), binding); + return b.createUnchecked(binding, value); + } + typeError(tree, b); + return b.createDefaultUnchecked(); + } + + @Override + public Object visit(MapBinding b) { + if(tree.getType() == GraphParser.MAP) { + int count = tree.getChildCount(); + Object[] keys = new Object[count]; + Object[] values = new Object[count]; + Binding keyBinding = b.getKeyBinding(); + Binding valueBinding = b.getValueBinding(); + for(int i=0;i