]> gerrit.simantics Code Review - simantics/sysdyn.git/commitdiff
Unit validation for functions (UnitType.Any) and array definitions. (refs #4263)
authorlempinen <lempinen@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Tue, 30 Apr 2013 07:08:37 +0000 (07:08 +0000)
committerlempinen <lempinen@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Tue, 30 Apr 2013 07:08:37 +0000 (07:08 +0000)
git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@27300 ac1ea38d-2e2b-0410-8846-a27921b304fc

21 files changed:
org.simantics.sysdyn.ontology/graph.tg
org.simantics.sysdyn.ontology/graph/Sysdyn.pgraph
org.simantics.sysdyn.ontology/src/org/simantics/sysdyn/SysdynResource.java
org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/properties/ConfigurationTab.java
org.simantics.sysdyn.ui/src/org/simantics/sysdyn/ui/validation/UnitFunction.java
org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/DelayExpression.java
org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/Expression.java
org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/IExpression.java
org.simantics.sysdyn/src/org/simantics/sysdyn/representation/expressions/WithLookupExpression.java
org.simantics.sysdyn/src/org/simantics/sysdyn/representation/utils/UnitUtils.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNode.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitCheckingNodeFactory.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jj
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParser.jjt
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/UnitParserTreeConstants.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Arithmetic.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/ComponentReferenceFull.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Term.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/UnitResult.java
org.simantics.sysdyn/src/org/simantics/sysdyn/unitParser/nodes/Value.java

index 4442534245cbb6d7d9b53ef67561f94f71d360b4..9140f080b3232e7ffd5d5e0aefe2f9cb58c44c4c 100644 (file)
Binary files a/org.simantics.sysdyn.ontology/graph.tg and b/org.simantics.sysdyn.ontology/graph.tg differ
index f04d001f78643ad961c1c58ba9ee3cd49f72433e..50113eb98fad9cb36f1eeb033e0a5ba0a89a5737 100644 (file)
@@ -45,10 +45,12 @@ SYSDYN.SysdynModel <T MOD.StructuralModel
     >-- SYSDYN.SysdynModel.solver --> L0.String <R L0.HasProperty : L0.FunctionalRelation
     >-- SYSDYN.SysdynModel.variableFilter --> L0.String <R L0.HasProperty : L0.FunctionalRelation
     >-- SYSDYN.SysdynModel.fmuFile --> L0.ByteArray <R L0.HasProperty
+    >-- SYSDYN.SysdynModel.timeUnit --> L0.String <R L0.HasProperty : L0.FunctionalRelation
 //    >-- SYSDYN.SysdynModel.exeFile --> L0.ByteArray <R L0.HasProperty
     @L0.assert SYSDYN.SysdynModel.startTime 0.0
     @L0.assert SYSDYN.SysdynModel.stopTime 10.0
     @L0.assert SYSDYN.SysdynModel.solver "euler"
+    @L0.assert SYSDYN.SysdynModel.timeUnit "month"    
     
 //#####################################################################
 // Configuration
index 875728d6470ff2b48e80a8fd8854dc24fa4a68cb..da4738a0a781a09de342539453f27627a2837ef3 100644 (file)
@@ -567,6 +567,8 @@ public class SysdynResource {
     public final Resource SysdynModel_startTime_Inverse;\r
     public final Resource SysdynModel_stopTime;\r
     public final Resource SysdynModel_stopTime_Inverse;\r
+    public final Resource SysdynModel_timeUnit;\r
+    public final Resource SysdynModel_timeUnit_Inverse;\r
     public final Resource SysdynModel_tolerance;\r
     public final Resource SysdynModel_tolerance_Inverse;\r
     public final Resource SysdynModel_variableFilter;\r
@@ -1248,6 +1250,8 @@ public class SysdynResource {
         public static final String SysdynModel_startTime_Inverse = "http://www.simantics.org/Sysdyn-1.1/SysdynModel/startTime/Inverse";\r
         public static final String SysdynModel_stopTime = "http://www.simantics.org/Sysdyn-1.1/SysdynModel/stopTime";\r
         public static final String SysdynModel_stopTime_Inverse = "http://www.simantics.org/Sysdyn-1.1/SysdynModel/stopTime/Inverse";\r
+        public static final String SysdynModel_timeUnit = "http://www.simantics.org/Sysdyn-1.1/SysdynModel/timeUnit";\r
+        public static final String SysdynModel_timeUnit_Inverse = "http://www.simantics.org/Sysdyn-1.1/SysdynModel/timeUnit/Inverse";\r
         public static final String SysdynModel_tolerance = "http://www.simantics.org/Sysdyn-1.1/SysdynModel/tolerance";\r
         public static final String SysdynModel_tolerance_Inverse = "http://www.simantics.org/Sysdyn-1.1/SysdynModel/tolerance/Inverse";\r
         public static final String SysdynModel_variableFilter = "http://www.simantics.org/Sysdyn-1.1/SysdynModel/variableFilter";\r
@@ -1939,6 +1943,8 @@ public class SysdynResource {
         SysdynModel_startTime_Inverse = getResourceOrNull(graph, URIs.SysdynModel_startTime_Inverse);\r
         SysdynModel_stopTime = getResourceOrNull(graph, URIs.SysdynModel_stopTime);\r
         SysdynModel_stopTime_Inverse = getResourceOrNull(graph, URIs.SysdynModel_stopTime_Inverse);\r
+        SysdynModel_timeUnit = getResourceOrNull(graph, URIs.SysdynModel_timeUnit);\r
+        SysdynModel_timeUnit_Inverse = getResourceOrNull(graph, URIs.SysdynModel_timeUnit_Inverse);\r
         SysdynModel_tolerance = getResourceOrNull(graph, URIs.SysdynModel_tolerance);\r
         SysdynModel_tolerance_Inverse = getResourceOrNull(graph, URIs.SysdynModel_tolerance_Inverse);\r
         SysdynModel_variableFilter = getResourceOrNull(graph, URIs.SysdynModel_variableFilter);\r
index e5e154f3e96e95f817936729016ce9c6112d4aff..4758261b1a1978b524a2c1136257cd7c141e3741 100644 (file)
@@ -231,6 +231,42 @@ public class ConfigurationTab extends LabelPropertyTabContributor {
             }\r
             \r
         });\r
+        \r
+        \r
+        TrackedCombo timeUnit = new TrackedCombo(composite, support, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);\r
+        timeUnit.setItemFactory(new ReadFactoryImpl<Resource, Map<String,Object>>() {\r
+\r
+            @Override\r
+            public Map<String, Object> perform(ReadGraph graph, final Resource input) throws DatabaseException {\r
+\r
+                Map<String, Object> map = new HashMap<String, Object>();\r
+                map.put("year", "year");\r
+                map.put("month", "month");\r
+                map.put("day", "day");\r
+                map.put("hour", "hour");\r
+                map.put("min", "min");\r
+                map.put("s", "s");\r
+                return map;\r
+            }\r
+        });\r
+        \r
+        timeUnit.setSelectionFactory(new ReadFactoryImpl<Resource, String>() {\r
+\r
+            @Override\r
+            public String perform(ReadGraph graph, final Resource input) throws DatabaseException {\r
+                String s = graph.getPossibleRelatedValue(input, SysdynResource.getInstance(graph).SysdynModel_timeUnit);\r
+                return s != null ? s : "month";\r
+            }\r
+        });\r
+        \r
+        timeUnit.addModifyListener(new ComboStringPropertyModifier<Resource>() {\r
+\r
+            @Override\r
+            public void applyText(WriteGraph graph, Resource input, String text)\r
+                    throws DatabaseException {\r
+                graph.claimLiteral(input, SysdynResource.getInstance(graph).SysdynModel_timeUnit, text);\r
+            }\r
+        });\r
   \r
         \r
         // Scrolled composite settings\r
index de8b9eee17b88cf6e55d6ff7372768f07d8f456d..f8e5839bea2de369ea52d05e5ee71f7755f4d996 100644 (file)
@@ -78,7 +78,7 @@ public class UnitFunction {
             Object expr = sm.getMapping().get(expression);\r
 \r
             if(expr != null && var != null && expr instanceof IExpression && var instanceof IndependentVariable) {\r
-                String result = ((IExpression)expr).matchUnits(graph, sm.getMapping());\r
+                String result = ((IExpression)expr).validateUnits(graph, sm);\r
                 if(result != null) {\r
                     Issue issue = new StandardIssue(SR.Validations_UnitWarning, independentVariable, expression, unitResource);\r
                     issues.add(issue);\r
@@ -117,7 +117,7 @@ public class UnitFunction {
         }\r
         \r
         Object expr = sm.getMapping().get(contexts.get(1));\r
-        String result = ((IExpression)expr).matchUnits(graph, sm.getMapping());\r
+        String result = ((IExpression)expr).validateUnits(graph, sm);\r
         return result;\r
     }\r
 \r
index 6a296c800a64ae04e203a01932197100ef76204a..59121d641c4449d50a9c6e58d46cd1885d071c21 100644 (file)
  *******************************************************************************/\r
 package org.simantics.sysdyn.representation.expressions;\r
 \r
+import org.simantics.db.ReadGraph;\r
 import org.simantics.objmap.annotations.GraphType;\r
 import org.simantics.objmap.annotations.RelatedValue;\r
 import org.simantics.sysdyn.SysdynResource;\r
+import org.simantics.sysdyn.manager.SysdynModel;\r
 import org.simantics.sysdyn.representation.IndependentVariable;\r
 import org.simantics.sysdyn.representation.Variability;\r
 import org.simantics.sysdyn.representation.utils.FormatUtils;\r
 import org.simantics.sysdyn.representation.utils.IndexUtils;\r
+import org.simantics.sysdyn.representation.utils.UnitUtils;\r
 \r
 /**\r
  * Representation of a delay expression. The order of the \r
@@ -252,5 +255,19 @@ public class DelayExpression extends Expression {
         return "This + is + not + a + parameter + at + any + time";\r
     }\r
 \r
+    \r
+    @Override\r
+    public String validateUnits(ReadGraph graph, SysdynModel model) {\r
+        if(parent.getUnit() == null)\r
+            return "Unit not defined for " + parent.getName();\r
+        \r
+        String result =  UnitUtils.matchUnits(graph, model, parent.getParentConfiguration(), parent.getUnit(), equation);\r
+        if(result == null)\r
+            result =  UnitUtils.matchUnits(graph, model, parent.getParentConfiguration(), parent.getUnit(), initialValue);\r
+        if(result == null)\r
+            result =  UnitUtils.matchUnits(graph, model, parent.getParentConfiguration(), UnitUtils.getTimeUnit(graph, model), delayTime);\r
+        \r
+        return result;\r
+    }\r
 \r
 }\r
index 9f5f28f06219aef28e46860ce94178ca43eac6e8..9a326e479b6d57eb471ee5facd78671bbcf5af4c 100644 (file)
@@ -13,10 +13,10 @@ package org.simantics.sysdyn.representation.expressions;
 \r
 import org.simantics.db.ReadGraph;\r
 import org.simantics.layer0.Layer0;\r
-import org.simantics.objmap.IMapping;\r
 import org.simantics.objmap.annotations.RelatedElement;\r
 import org.simantics.objmap.annotations.RelatedValue;\r
 import org.simantics.sysdyn.SysdynResource;\r
+import org.simantics.sysdyn.manager.SysdynModel;\r
 import org.simantics.sysdyn.representation.IndependentVariable;\r
 import org.simantics.sysdyn.representation.utils.UnitUtils;\r
 \r
@@ -63,12 +63,12 @@ public abstract class Expression implements IExpression {
     }\r
 \r
     @Override\r
-    public String matchUnits() {\r
-        return UnitUtils.matchUnits(null, null, parent, getExpression());\r
+    public String validateUnits() {\r
+        return validateUnits(null, null);\r
     }\r
     \r
     @Override\r
-    public String matchUnits(ReadGraph graph, IMapping mapping) {\r
-        return UnitUtils.matchUnits(graph, mapping, parent, getExpression());\r
+    public String validateUnits(ReadGraph graph, SysdynModel model) {\r
+        return UnitUtils.matchUnits(graph, model, parent.getParentConfiguration(), parent.getUnit(), getExpression());\r
     }\r
 }\r
index 48ecdaa47f361cdc89ddf0410b92f74b5c6c911b..78f21bacd582548d85c138d1b6655a2a3277cd6f 100644 (file)
@@ -12,7 +12,7 @@
 package org.simantics.sysdyn.representation.expressions;\r
 \r
 import org.simantics.db.ReadGraph;\r
-import org.simantics.objmap.IMapping;\r
+import org.simantics.sysdyn.manager.SysdynModel;\r
 \r
 \r
 /**\r
@@ -63,15 +63,15 @@ public interface IExpression {
      * Match the units of this expression to units of its variable\r
      * @return null if match, Error message otherwise\r
      */\r
-    String matchUnits();\r
+    String validateUnits();\r
     \r
     /**\r
      * Match the units of this expression to units of its variable. \r
      * \r
      * Requests units of referred variables for request listening\r
      * @param graph ReadGraph\r
-     * @param mapping ObjMap mapping\r
+     * @param model SysdynModel (with mapping)\r
      * @return null if match, ERror message otherwise\r
      */\r
-    String matchUnits(ReadGraph graph, IMapping mapping);\r
+    String validateUnits(ReadGraph graph, SysdynModel model);\r
 }\r
index c98ee79a9e6e60bfc7ce7f6988d3f9bfa06090ef..2343eb8cb04d8fbfd92f10572210d8b9fe3d7acb 100644 (file)
  *******************************************************************************/\r
 package org.simantics.sysdyn.representation.expressions;\r
 \r
+import org.simantics.db.ReadGraph;\r
 import org.simantics.objmap.annotations.GraphType;\r
 import org.simantics.objmap.annotations.RelatedValue;\r
 import org.simantics.sysdyn.SysdynResource;\r
+import org.simantics.sysdyn.manager.SysdynModel;\r
 import org.simantics.sysdyn.representation.utils.FormatUtils;\r
 import org.simantics.sysdyn.representation.utils.IndexUtils;\r
 import org.simantics.sysdyn.representation.utils.SheetFormatUtils;\r
+import org.simantics.sysdyn.representation.utils.UnitUtils;\r
 \r
 /**\r
  * Representation of a withlookup expression\r
@@ -46,4 +49,16 @@ public class WithLookupExpression extends Expression {
         return "interpolate(" + equation + ", " + lookupTable + ")";\r
     }\r
 \r
+    @Override\r
+    public String validateUnits(ReadGraph graph, SysdynModel model) {\r
+        if(parent.getUnit() == null)\r
+            return "Unit not defined for " + parent.getName();\r
+        \r
+        String result = UnitUtils.expressionUnitsValid(graph, model, parent.getParentConfiguration(), equation);\r
+        if(result == null) {\r
+            result = UnitUtils.expressionUnitsValid(graph, model, parent.getParentConfiguration(), equation);\r
+        }\r
+        \r
+        return result;\r
+    }\r
 }\r
index 85365768ca5ec3bafd01df02d5514318701837fd..eca1fe34dfe80c343b38f938a105837583a5fa80 100644 (file)
@@ -20,8 +20,9 @@ import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;\r
 import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;\r
 import org.simantics.db.exception.ServiceException;\r
-import org.simantics.objmap.IMapping;\r
+import org.simantics.simulation.ontology.SimulationResource;\r
 import org.simantics.sysdyn.SysdynResource;\r
+import org.simantics.sysdyn.manager.SysdynModel;\r
 import org.simantics.sysdyn.representation.Configuration;\r
 import org.simantics.sysdyn.representation.IElement;\r
 import org.simantics.sysdyn.representation.Module;\r
@@ -35,9 +36,30 @@ import org.simantics.sysdyn.unitParser.nodes.UnitResult;
 \r
 public class UnitUtils {\r
     \r
-    public static String matchUnits(ReadGraph graph, IMapping mapping, Variable variable, String expression) {\r
-        if(variable.getUnit() == null)\r
-            return "Unit not defined for " + variable.getName();\r
+    public static String expressionUnitsValid(ReadGraph graph, SysdynModel model, Configuration configuration, String expression) {\r
+        try {\r
+            StringReader reader = new StringReader(expression);\r
+            UnitParser parser = new UnitParser(reader);\r
+            UnitCheckingNode node = (UnitCheckingNode) parser.expr();\r
+            reader.close();\r
+            Set<String> components = UnitUtils.findComponents(node);\r
+            HashMap<String, String> units = UnitUtils.findUnits(graph, model, configuration, components);\r
+            \r
+            try {\r
+                node.getUnits(units);\r
+            } catch (UnitCheckingException e) {\r
+                return e.getMessage();\r
+            }\r
+            \r
+        } catch (ParseException e) {\r
+            e.printStackTrace();\r
+        }\r
+        return null;\r
+    }\r
+    \r
+    public static String matchUnits(ReadGraph graph, SysdynModel model, Configuration configuration, String unit, String expression) {\r
+        if(unit == null)\r
+            return "Unit not defined";\r
         try {\r
             \r
             StringReader rightReader = new StringReader(expression);\r
@@ -45,9 +67,9 @@ public class UnitUtils {
             UnitCheckingNode right = (UnitCheckingNode) rightParser.expr();\r
             rightReader.close();\r
             Set<String> components = findComponents(right);\r
-            HashMap<String, String> units = findUnits(graph, mapping, variable, components);\r
+            HashMap<String, String> units = findUnits(graph, model, configuration, components);\r
             \r
-            StringReader leftReader = new StringReader(variable.getUnit());\r
+            StringReader leftReader = new StringReader(unit);\r
             UnitParser leftParser = new UnitParser(leftReader);\r
             UnitCheckingNode left = (UnitCheckingNode) leftParser.expr();\r
             leftReader.close();\r
@@ -62,7 +84,6 @@ public class UnitUtils {
                 return e.getMessage();\r
             }\r
             \r
-//            node.dump("");\r
         } catch (ParseException e) {\r
             e.printStackTrace();\r
         }\r
@@ -71,16 +92,15 @@ public class UnitUtils {
     }\r
     \r
     \r
-    private static HashMap<String, String> findUnits(ReadGraph graph, IMapping mapping, Variable variable, Set<String> components) {\r
+    public static HashMap<String, String> findUnits(ReadGraph graph, SysdynModel model, Configuration configuration, Set<String> components) {\r
         HashMap<String, String> units = new HashMap<String, String>();\r
-        Configuration configuration = variable.getParentConfiguration();\r
         for(String component : components) {\r
             Variable var = getElement(configuration, component);\r
             if(var != null) {\r
                 \r
                 // Support listening, if graph and mapping exists\r
-                if(graph != null && mapping != null) {\r
-                    Resource varResource = mapping.inverseGet(var);\r
+                if(graph != null && model != null) {\r
+                    Resource varResource = model.getMapping().inverseGet(var);\r
                     if(varResource != null) {\r
                         try {\r
                             graph.getPossibleRelatedValue(varResource, SysdynResource.getInstance(graph).Variable_unit);\r
@@ -99,11 +119,30 @@ public class UnitUtils {
             }\r
         }\r
         \r
-        \r
+        units.put("time", getTimeUnit(graph, model));\r
         \r
         return units;\r
     }\r
     \r
+    public static String getTimeUnit(ReadGraph graph, SysdynModel model) {\r
+        try {\r
+            Resource modelResource = graph.getPossibleObject(model.getConfigurationResource(), SimulationResource.getInstance(graph).IsConfigurationOf);\r
+            if(modelResource != null) {\r
+                String timeUnit = graph.getPossibleRelatedValue(modelResource, SysdynResource.getInstance(graph).SysdynModel_timeUnit);\r
+                if(timeUnit == null)\r
+                    timeUnit = "month";\r
+                return timeUnit;\r
+            }\r
+                \r
+        } catch (ManyObjectsForFunctionalRelationException e) {\r
+            e.printStackTrace();\r
+        } catch (ServiceException e) {\r
+            e.printStackTrace();\r
+        }\r
+        \r
+        return null;\r
+    }\r
+    \r
     private static Variable getElement(Configuration configuration, String name) {\r
         String[] elements = name.split("\\.");\r
         String element = elements[0];\r
@@ -122,7 +161,7 @@ public class UnitUtils {
         return null;\r
     }\r
     \r
-    private static Set<String> findComponents(UnitCheckingNode node) {\r
+    public static Set<String> findComponents(UnitCheckingNode node) {\r
         HashSet<String> components = new HashSet<String>();\r
         addComponents(node, components);\r
         return components;\r
index e80e60f6668238787c891bd85e8b9a397e213180..399d04d844f07b0ef95fb4de8cb1569ebbe3b869 100644 (file)
@@ -11,7 +11,6 @@
  *******************************************************************************/\r
 package org.simantics.sysdyn.unitParser;\r
 \r
-import java.util.ArrayList;\r
 import java.util.HashMap;\r
 \r
 import org.simantics.sysdyn.unitParser.nodes.UnitResult;\r
@@ -30,22 +29,13 @@ public class UnitCheckingNode extends SimpleNode {
             String node = printNode();\r
             result.append(node);\r
         } else {\r
-            for(UnitCheckingNode node : getChildren()) {\r
-                result.appendResult(node.getUnits(units));\r
+            for(int i = 0; i < jjtGetNumChildren(); i++) {\r
+                result.appendResult(((UnitCheckingNode)jjtGetChild(i)).getUnits(units));\r
             }\r
         }\r
         return result; \r
     }\r
     \r
-    protected ArrayList<UnitCheckingNode> getChildren() {\r
-        ArrayList<UnitCheckingNode> children = new ArrayList<UnitCheckingNode>();\r
-        for(int i = 0; i < jjtGetNumChildren(); i++) {\r
-            children.add((UnitCheckingNode)jjtGetChild(i));\r
-        }\r
-        return children;\r
-    }\r
-\r
-\r
     public String printNode() {\r
         StringBuilder sb = new StringBuilder();\r
         Token token = jjtGetFirstToken();\r
index 434b982b4fcfde2c315b7f135c0e1cae820928de..e3db8e8f4bfceb137489c1076093831a58ae99aa 100644 (file)
@@ -16,12 +16,16 @@ import java.util.HashMap;
 \r
 import org.simantics.sysdyn.unitParser.nodes.AddOp;\r
 import org.simantics.sysdyn.unitParser.nodes.Arithmetic;\r
+import org.simantics.sysdyn.unitParser.nodes.ArrayDefinition;\r
 import org.simantics.sysdyn.unitParser.nodes.ComponentIdentity;\r
 import org.simantics.sysdyn.unitParser.nodes.ComponentReference;\r
 import org.simantics.sysdyn.unitParser.nodes.ComponentReferenceFull;\r
 import org.simantics.sysdyn.unitParser.nodes.Condition;\r
 import org.simantics.sysdyn.unitParser.nodes.Divide;\r
+import org.simantics.sysdyn.unitParser.nodes.Expression;\r
 import org.simantics.sysdyn.unitParser.nodes.ForIndex;\r
+import org.simantics.sysdyn.unitParser.nodes.FunctionArguments;\r
+import org.simantics.sysdyn.unitParser.nodes.FunctionCall;\r
 import org.simantics.sysdyn.unitParser.nodes.IfThenElse;\r
 import org.simantics.sysdyn.unitParser.nodes.Multiplication;\r
 import org.simantics.sysdyn.unitParser.nodes.RelOp;\r
@@ -38,6 +42,7 @@ public class UnitCheckingNodeFactory {
         constructors.put("term", Term.class);\r
         constructors.put("arithmetic_expression", Arithmetic.class);\r
         constructors.put("ifthenelse", IfThenElse.class);\r
+        constructors.put("array_definition", ArrayDefinition.class);\r
         \r
         constructors.put("component_reference_full", ComponentReferenceFull.class);\r
         constructors.put("value", Value.class);\r
@@ -54,6 +59,10 @@ public class UnitCheckingNodeFactory {
         constructors.put("component_identity", ComponentIdentity.class);\r
         constructors.put("condition", Condition.class);\r
         constructors.put("for_index", ForIndex.class);\r
+        constructors.put("function_call", FunctionCall.class);\r
+        constructors.put("function_arguments", FunctionArguments.class);\r
+        constructors.put("expression", Expression.class);\r
+\r
         \r
     }\r
     \r
index 1579b6cdc485eca0de5f5376c6c93fe1b577e636..eff84e4320495b19c87ec9e7f41fdc9105b042b9 100644 (file)
@@ -789,9 +789,7 @@ public class UnitParser/*@bgen(jjtree)*/implements UnitParserTreeConstants, Unit
             jj_consume_token(65);\r
             break;\r
           case 62:\r
-            jj_consume_token(62);\r
-            function_arguments();\r
-            jj_consume_token(63);\r
+            array_definition();\r
             break;\r
           case 35:\r
             jj_consume_token(35);\r
@@ -855,6 +853,38 @@ public class UnitParser/*@bgen(jjtree)*/implements UnitParserTreeConstants, Unit
     }\r
   }\r
 \r
+  final public void array_definition() throws ParseException {\r
+                           /*@bgen(jjtree) array_definition */\r
+  UnitCheckingNode jjtn000 = (UnitCheckingNode)UnitCheckingNodeFactory.jjtCreate(JJTARRAY_DEFINITION);\r
+  boolean jjtc000 = true;\r
+  jjtree.openNodeScope(jjtn000);\r
+  jjtn000.jjtSetFirstToken(getToken(1));\r
+    try {\r
+      jj_consume_token(62);\r
+      function_arguments();\r
+      jj_consume_token(63);\r
+    } catch (Throwable jjte000) {\r
+    if (jjtc000) {\r
+      jjtree.clearNodeScope(jjtn000);\r
+      jjtc000 = false;\r
+    } else {\r
+      jjtree.popNode();\r
+    }\r
+    if (jjte000 instanceof RuntimeException) {\r
+      {if (true) throw (RuntimeException)jjte000;}\r
+    }\r
+    if (jjte000 instanceof ParseException) {\r
+      {if (true) throw (ParseException)jjte000;}\r
+    }\r
+    {if (true) throw (Error)jjte000;}\r
+    } finally {\r
+    if (jjtc000) {\r
+      jjtree.closeNodeScope(jjtn000, true);\r
+      jjtn000.jjtSetLastToken(getToken(0));\r
+    }\r
+    }\r
+  }\r
+\r
   final public void function_call() throws ParseException {\r
                         /*@bgen(jjtree) function_call */\r
   UnitCheckingNode jjtn000 = (UnitCheckingNode)UnitCheckingNodeFactory.jjtCreate(JJTFUNCTION_CALL);\r
@@ -1539,8 +1569,7 @@ void named_arguments() : {
       default:\r
         jj_la1[40] = jj_gen;\r
         if (jj_2_3(2147483647)) {\r
-          name();\r
-          function_call_args();\r
+          function_call();\r
         } else {\r
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
           case IDENT:\r
@@ -1633,19 +1662,6 @@ void named_arguments() : {
     finally { jj_save(2, xla); }\r
   }\r
 \r
-  private boolean jj_3_2() {\r
-    if (jj_3R_13()) return true;\r
-    return false;\r
-  }\r
-\r
-  private boolean jj_3R_11() {\r
-    if (jj_scan_token(IDENT)) return true;\r
-    Token xsp;\r
-    xsp = jj_scanpos;\r
-    if (jj_3R_14()) jj_scanpos = xsp;\r
-    return false;\r
-  }\r
-\r
   private boolean jj_3R_14() {\r
     if (jj_scan_token(66)) return true;\r
     if (jj_3R_11()) return true;\r
@@ -1669,6 +1685,19 @@ void named_arguments() : {
     return false;\r
   }\r
 \r
+  private boolean jj_3_2() {\r
+    if (jj_3R_13()) return true;\r
+    return false;\r
+  }\r
+\r
+  private boolean jj_3R_11() {\r
+    if (jj_scan_token(IDENT)) return true;\r
+    Token xsp;\r
+    xsp = jj_scanpos;\r
+    if (jj_3R_14()) jj_scanpos = xsp;\r
+    return false;\r
+  }\r
+\r
   private boolean jj_3_1() {\r
     if (jj_3R_11()) return true;\r
     if (jj_3R_12()) return true;\r
index c5d0883ebe54452c3eb40c0f6d4736baa0a8c92e..789c74744e5dd4a622519e66e44366e49f3cf69c 100644 (file)
@@ -573,7 +573,7 @@ void primary() : {/*@bgen(jjtree) primary */
   /*| "(" output_expression_list() ")"*/ // Not needed, replaced with following:\r
   | parenthesis_expression()\r
   | "[" expression_list() ( ";" expression_list() )* "]"\r
-  | "{" function_arguments() "}"\r
+  | array_definition()\r
   | "end"/*@bgen(jjtree)*/\r
   } catch (Throwable jjte000) {\r
     if (jjtc000) {\r
@@ -631,6 +631,39 @@ void component_reference_full() : {/*@bgen(jjtree) component_reference_full */
 /*@egen*/\r
 }\r
 \r
+void array_definition() : {/*@bgen(jjtree) array_definition */\r
+  UnitCheckingNode jjtn000 = (UnitCheckingNode)UnitCheckingNodeFactory.jjtCreate(JJTARRAY_DEFINITION);\r
+  boolean jjtc000 = true;\r
+  jjtree.openNodeScope(jjtn000);\r
+  jjtn000.jjtSetFirstToken(getToken(1));\r
+/*@egen*/\r
+} {/*@bgen(jjtree) array_definition */\r
+  try {\r
+/*@egen*/\r
+  "{" function_arguments() "}"/*@bgen(jjtree)*/\r
+  } catch (Throwable jjte000) {\r
+    if (jjtc000) {\r
+      jjtree.clearNodeScope(jjtn000);\r
+      jjtc000 = false;\r
+    } else {\r
+      jjtree.popNode();\r
+    }\r
+    if (jjte000 instanceof RuntimeException) {\r
+      throw (RuntimeException)jjte000;\r
+    }\r
+    if (jjte000 instanceof ParseException) {\r
+      throw (ParseException)jjte000;\r
+    }\r
+    throw (Error)jjte000;\r
+  } finally {\r
+    if (jjtc000) {\r
+      jjtree.closeNodeScope(jjtn000, true);\r
+      jjtn000.jjtSetLastToken(getToken(0));\r
+    }\r
+  }\r
+/*@egen*/\r
+}\r
+\r
 void function_call() : {/*@bgen(jjtree) function_call */\r
   UnitCheckingNode jjtn000 = (UnitCheckingNode)UnitCheckingNodeFactory.jjtCreate(JJTFUNCTION_CALL);\r
   boolean jjtc000 = true;\r
@@ -1127,7 +1160,7 @@ void subscript() : {/*@bgen(jjtree) subscript */
 } {/*@bgen(jjtree) subscript */\r
         try {\r
 /*@egen*/\r     ":"\r
-       |   LOOKAHEAD( name() parenthesis_open() ) name() function_call_args()\r
+       |   LOOKAHEAD( name() parenthesis_open() ) function_call()\r
        | rangeIndex() ( ":" rangeIndex())?/*@bgen(jjtree)*/\r
         } catch (Throwable jjte000) {\r
           if (jjtc000) {\r
index e7f879383e9ae56ed7aca578f4b2fd3d1fe9a0aa..9e8521e10e1de12edc221380786024e20a533021 100644 (file)
@@ -158,7 +158,7 @@ void primary() : {
   /*| "(" output_expression_list() ")"*/ // Not needed, replaced with following:\r
   | parenthesis_expression()\r
   | "[" expression_list() ( ";" expression_list() )* "]"\r
-  | "{" function_arguments() "}"\r
+  | array_definition()\r
   | "end"\r
 }\r
 \r
@@ -167,6 +167,11 @@ void component_reference_full() : {
     component_reference()\r
 }\r
 \r
+void array_definition() : {\r
+} {\r
+  "{" function_arguments() "}"\r
+}\r
+\r
 void function_call() : {\r
 } {\r
     name() function_call_args()\r
@@ -264,7 +269,7 @@ void array_subscripts() : {
 \r
 void subscript() : {\r
 } {\r   ":"\r
-       |   LOOKAHEAD( name() parenthesis_open() ) name() function_call_args()\r
+       |   LOOKAHEAD( name() parenthesis_open() ) function_call()\r
        | rangeIndex() ( ":" rangeIndex())?\r
 }\r
 \r
index d790ceb2857f967fc8a075a02acd68c639728b27..62b026d4992df16cba83588b69a8135f5c31ec8f 100644 (file)
@@ -21,24 +21,25 @@ public interface UnitParserTreeConstants
   public int JJTDIVIDE = 15;\r
   public int JJTPRIMARY = 16;\r
   public int JJTCOMPONENT_REFERENCE_FULL = 17;\r
-  public int JJTFUNCTION_CALL = 18;\r
-  public int JJTPARENTHESIS_EXPRESSION = 19;\r
-  public int JJTVALUE = 20;\r
-  public int JJTPARENTHESIS_OPEN = 21;\r
-  public int JJTPARENTHESIS_CLOSE = 22;\r
-  public int JJTNAME = 23;\r
-  public int JJTCOMPONENT_REFERENCE = 24;\r
-  public int JJTCOMPONENT_IDENTITY = 25;\r
-  public int JJTFUNCTION_CALL_ARGS = 26;\r
-  public int JJTFUNCTION_ARGUMENTS = 27;\r
-  public int JJTFOR_INDICES = 28;\r
-  public int JJTFOR_INDEX = 29;\r
-  public int JJTNAMED_ARGUMENT = 30;\r
-  public int JJTOUTPUT_EXPRESSION_LIST = 31;\r
-  public int JJTEXPRESSION_LIST = 32;\r
-  public int JJTARRAY_SUBSCRIPTS = 33;\r
-  public int JJTSUBSCRIPT = 34;\r
-  public int JJTRANGEINDEX = 35;\r
+  public int JJTARRAY_DEFINITION = 18;\r
+  public int JJTFUNCTION_CALL = 19;\r
+  public int JJTPARENTHESIS_EXPRESSION = 20;\r
+  public int JJTVALUE = 21;\r
+  public int JJTPARENTHESIS_OPEN = 22;\r
+  public int JJTPARENTHESIS_CLOSE = 23;\r
+  public int JJTNAME = 24;\r
+  public int JJTCOMPONENT_REFERENCE = 25;\r
+  public int JJTCOMPONENT_IDENTITY = 26;\r
+  public int JJTFUNCTION_CALL_ARGS = 27;\r
+  public int JJTFUNCTION_ARGUMENTS = 28;\r
+  public int JJTFOR_INDICES = 29;\r
+  public int JJTFOR_INDEX = 30;\r
+  public int JJTNAMED_ARGUMENT = 31;\r
+  public int JJTOUTPUT_EXPRESSION_LIST = 32;\r
+  public int JJTEXPRESSION_LIST = 33;\r
+  public int JJTARRAY_SUBSCRIPTS = 34;\r
+  public int JJTSUBSCRIPT = 35;\r
+  public int JJTRANGEINDEX = 36;\r
 \r
 \r
   public String[] jjtNodeName = {\r
@@ -60,6 +61,7 @@ public interface UnitParserTreeConstants
     "divide",\r
     "primary",\r
     "component_reference_full",\r
+    "array_definition",\r
     "function_call",\r
     "parenthesis_expression",\r
     "value",\r
@@ -80,4 +82,4 @@ public interface UnitParserTreeConstants
     "rangeIndex",\r
   };\r
 }\r
-/* JavaCC - OriginalChecksum=e2f99f7df8969b486d8da5159d18ad81 (do not edit this line) */\r
+/* JavaCC - OriginalChecksum=9313cac9e0951f8836c120d51f6c620b (do not edit this line) */\r
index a24ef52dd4ff675179d3081e76baddfc6a7923d0..d844bb7ce77b1bc96b4996c3089ce94fc497363a 100644 (file)
@@ -40,13 +40,14 @@ public class Arithmetic extends UnitCheckingNode {
         for(int i = 0; i < jjtGetNumChildren(); i++) {\r
             candidateNode = ((UnitCheckingNode)jjtGetChild(i));\r
             UnitResult candidateUnits = candidateNode.getUnits(units);\r
-            if(candidateUnits.getUnitType() == UnitType.OPERATOR || candidateUnits.getUnitType() == UnitType.ANY) {\r
-                result.setUnitType(candidateUnits.getUnitType());\r
+            if(candidateUnits.getUnitType() == UnitType.OPERATOR) {\r
                 continue;\r
-            } else if(base == null) {\r
+            } else if(base == null || result.getUnitType() == UnitType.SCALAR || result.getUnitType() == UnitType.ANY) {\r
                 base = ((UnitCheckingNode)jjtGetChild(i));\r
                 result.appendResult(base.getUnits(units));\r
                 continue;\r
+            } else if(candidateUnits.getUnitType() == UnitType.SCALAR) {\r
+                continue;\r
             } else {\r
                 operator = ((UnitCheckingNode)jjtGetChild(i-1));\r
                 if(!result.equals(candidateUnits)) {\r
@@ -57,7 +58,7 @@ public class Arithmetic extends UnitCheckingNode {
                 }\r
             }\r
         }\r
-\r
+//        System.out.println("Arithmetic: " + printNode() + " [" + result.getFullUnit() + " : " + result.getUnitType() + "]");\r
         return result;\r
     }\r
 \r
index d771dc3df47d619153c612ab55d4ccda8c4ed39e..0f8ec7041b08329694e2a36da28a33d2522b5d9e 100644 (file)
@@ -18,6 +18,7 @@ import org.simantics.sysdyn.unitParser.ParseException;
 import org.simantics.sysdyn.unitParser.UnitCheckingException;\r
 import org.simantics.sysdyn.unitParser.UnitCheckingNode;\r
 import org.simantics.sysdyn.unitParser.UnitParser;\r
+import org.simantics.sysdyn.unitParser.nodes.UnitResult.UnitType;\r
 \r
 /**\r
  * See UnitCheckingNodeFactory for mapping\r
@@ -47,7 +48,13 @@ public class ComponentReferenceFull extends UnitCheckingNode {
     @Override\r
     public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
         String node = printNode();\r
-        node = printNode();\r
+        \r
+        if("dmnl".equals(node)) {\r
+            UnitResult result = new UnitResult();\r
+            result.setUnitType(UnitType.DMNL);\r
+            return result;\r
+        }\r
+        \r
         if(units != null) {\r
             if(!units.containsKey(node))\r
                 throw new UnitCheckingException("No units defined for " + node);\r
index 77408c00eaa593e89a3767bff693d3a852f206a9..33a37fd327faf968247ffc24ee655a0c68dc72d3 100644 (file)
@@ -40,7 +40,11 @@ public class Term extends UnitCheckingNode {
             current = ((UnitCheckingNode)jjtGetChild(i));\r
             UnitResult currentUnits = current.getUnits(units);\r
 \r
-            if(currentUnits.getUnitType() == UnitType.OPERATOR) {\r
+            if(currentUnits.getUnitType() == UnitType.ANY) {\r
+                result = new UnitResult();\r
+                result.setUnitType(UnitType.ANY);\r
+                return result;\r
+            } else if(currentUnits.getUnitType() == UnitType.OPERATOR) {\r
                 continue;\r
             } else if(base == null) {\r
                 base = current;\r
@@ -50,24 +54,26 @@ public class Term extends UnitCheckingNode {
                 operator = ((UnitCheckingNode)jjtGetChild(i-1));\r
 \r
                 if(operator instanceof Multiplication) {\r
-                    if(currentUnits.getUnitType() != UnitType.ANY) {\r
+                    UnitType unitType = currentUnits.getUnitType();\r
+                    if(unitType != UnitType.SCALAR && unitType != UnitType.DMNL) {\r
                         result.append(operator.printNode());\r
                         result.appendResult(currentUnits);\r
                     }\r
-                } else if(operator instanceof Divide){\r
+                } else if(operator instanceof Divide) {\r
                     result.append(operator.printNode());\r
                     result.addAllDividers(currentUnits.getDividers());\r
                     result.addAllDividers(currentUnits.getDividents());\r
-                    result.setUnitType(currentUnits.getUnitType());\r
                     \r
-                    if(currentUnits.getUnitType() == UnitType.ANY)\r
+                    UnitType unitType = currentUnits.getUnitType();\r
+                    result.setUnitType(unitType);\r
+                    if(unitType == UnitType.SCALAR || unitType == UnitType.DMNL)\r
                         result.append("1");\r
                     else\r
                         result.append(currentUnits.getFullUnit());\r
                 }\r
             }\r
         }\r
-        \r
+//        System.out.println("Term: " + printNode() + " [" + result.getFullUnit() + " : " + result.getUnitType() + "]");\r
         return result;\r
     }\r
 \r
index 27851346061d50037c85875adf435899f812c867..72fcb73d8c5dc5ba50e121f7a36f394a74bd4cda 100644 (file)
@@ -32,12 +32,16 @@ import java.util.Iterator;
  */\r
 public class UnitResult {\r
     \r
-    public enum UnitType {NORMAL, ANY, DMNL, OPERATOR};\r
+    public enum UnitType {NORMAL, ANY, DMNL, OPERATOR, SCALAR};\r
     \r
     private ArrayList<String> dividers = new ArrayList<String>();\r
     private ArrayList<String> dividents = new ArrayList<String>();\r
     private StringBuilder fullUnit = new StringBuilder();\r
-    private UnitType unitType = UnitType.NORMAL;\r
+    private UnitType unitType;\r
+    \r
+    public UnitResult() {\r
+        setUnitType(UnitType.NORMAL);\r
+    }\r
     \r
     public void appendResult(UnitResult result) {\r
         addAllDividents(result.getDividents());\r
@@ -139,6 +143,9 @@ public class UnitResult {
         if(getUnitType() == UnitType.ANY || other.getUnitType() == UnitType.ANY)\r
             return true;\r
         \r
+        if(getUnitType() != other.getUnitType())\r
+            return true;\r
+        \r
         ArrayList<String> copyDividers1 = new ArrayList<String>(dividers);\r
         ArrayList<String> copyDividents1 = new ArrayList<String>(dividents);\r
         reduceUnitLists(dividents, copyDividents1, copyDividers1);\r
@@ -190,4 +197,9 @@ public class UnitResult {
     public void setUnitType(UnitType unitType) {\r
         this.unitType = unitType;\r
     }\r
+    \r
+    @Override\r
+    public String toString() {\r
+        return getCleanFullUnit();\r
+    }\r
 }\r
index 3da4c149f55dcf39230b65edfc7faf30f818ec15..1ba0fc005e4ab7407e66354705d953267177bb81 100644 (file)
@@ -31,7 +31,7 @@ public class Value extends UnitCheckingNode {
     @Override\r
     public UnitResult getUnits(HashMap<String, String> units) throws UnitCheckingException {\r
         UnitResult result = super.getUnits(units);\r
-        result.setUnitType(UnitType.ANY);\r
+        result.setUnitType(UnitType.SCALAR);\r
         return result;\r
     }\r
 }\r