--- /dev/null
+package org.simantics.modeling.ui.expression;\r
+\r
+import java.util.HashMap;\r
+import java.util.Stack;\r
+\r
+import org.simantics.basicexpression.analysis.DepthFirstAdapter;\r
+import org.simantics.basicexpression.node.AAddressValue;\r
+import org.simantics.basicexpression.node.AConstantValue;\r
+import org.simantics.basicexpression.node.ADivMultiplicative;\r
+import org.simantics.basicexpression.node.AFunctionPrimary;\r
+import org.simantics.basicexpression.node.AMinusExpression;\r
+import org.simantics.basicexpression.node.AMultMultiplicative;\r
+import org.simantics.basicexpression.node.APlusExpression;\r
+import org.simantics.basicexpression.node.ARangeValue;\r
+import org.simantics.basicexpression.node.ARviValue;\r
+import org.simantics.basicexpression.node.ASequenceArgList;\r
+import org.simantics.basicexpression.node.ASingleArgList;\r
+import org.simantics.basicexpression.node.AStringValue;\r
+import org.simantics.basicexpression.node.PArgList;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.Function;\r
+import org.simantics.db.layer0.variable.Variable;\r
+\r
+public class BasicExpressionVisitor extends DepthFirstAdapter {\r
+\r
+ public static final boolean DEBUG_APPLICATION = false;\r
+ \r
+ public static class ApplicationException extends Exception {\r
+\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public ApplicationException(String message) {\r
+ super(message);\r
+ }\r
+\r
+ }\r
+\r
+ final ReadGraph graph;\r
+ final Variable property;\r
+ \r
+ Stack<Object> stack = new Stack<Object>();\r
+\r
+ HashMap<String, Function> builtins = new HashMap<String, Function>();\r
+\r
+ public BasicExpressionVisitor(ReadGraph graph, Variable property) {\r
+\r
+ this.graph = graph;\r
+ this.property = property;\r
+ \r
+ }\r
+\r
+ public Object getResult() {\r
+ return stack.pop();\r
+ }\r
+\r
+ public void outAConstantValue(AConstantValue node) {\r
+ // System.out.println("eval constant " + node);\r
+ stack.push(Double.valueOf(node.toString()));\r
+ }\r
+\r
+ public void outAStringValue(AStringValue node) {\r
+\r
+ try {\r
+ String value = node.toString();\r
+ String rvi = value.substring(1, value.length() - 2).trim(); \r
+ Variable relative = property.browse(graph, rvi);\r
+ stack.push(relative.getValue(graph));\r
+ } catch (DatabaseException e) {\r
+ stack.push(e);\r
+ }\r
+ \r
+ }\r
+\r
+ @Override\r
+ public void outARviValue(ARviValue node) {\r
+ \r
+ try {\r
+ String value = node.toString();\r
+ String rvi = value.trim(); \r
+// System.out.println("property=" + property.getURI(graph) + " " + property);\r
+// System.out.println("rvi=" + rvi);\r
+ Variable relative = property.browse(graph, rvi);\r
+// System.out.println("relative=" + relative.getURI(graph));\r
+ Object valueObject = relative.getValue(graph); \r
+// System.out.println("relative2=" + relative.getURI(graph) + " -> " + valueObject);\r
+ stack.push(valueObject);\r
+ } catch (DatabaseException e) {\r
+ stack.push(e);\r
+ }\r
+ \r
+ }\r
+ \r
+ public void outAAddressValue(AAddressValue node) {\r
+ stack.push('&' + node.getRange().toString());\r
+ }\r
+\r
+ public void outARangeValue(ARangeValue node) {\r
+ }\r
+\r
+ private double extractValue(Object o) {\r
+ if (o instanceof Number) {\r
+ return ((Number) o).doubleValue();\r
+ } else if (o instanceof String) {\r
+ return Double.valueOf((String) o);\r
+ } else {\r
+ return Double.NaN;\r
+ }\r
+ }\r
+\r
+ public void outAPlusExpression(APlusExpression node) {\r
+ Object o1 = stack.pop();\r
+ Object o2 = stack.pop();\r
+ double d1 = extractValue(o1);\r
+ double d2 = extractValue(o2);\r
+ stack.push(d1 + d2);\r
+ // System.out.println("plus " + d1 + " " + d2);\r
+ }\r
+\r
+ public void outAMinusExpression(AMinusExpression node) {\r
+ Object o2 = stack.pop();\r
+ Object o1 = stack.pop();\r
+ double d1 = extractValue(o1);\r
+ double d2 = extractValue(o2);\r
+// System.out.println("minus " + d1 + " " + d2);\r
+ stack.push(d1 - d2);\r
+ }\r
+\r
+ public void outAMultMultiplicative(AMultMultiplicative node) {\r
+ Object o1 = stack.pop();\r
+ Object o2 = stack.pop();\r
+ double d1 = extractValue(o1);\r
+ double d2 = extractValue(o2);\r
+ stack.push(d1 * d2);\r
+ // System.out.println("mult " + d1 + " " + d2);\r
+ }\r
+ \r
+ @Override\r
+ public void outADivMultiplicative(ADivMultiplicative node) {\r
+ Object o1 = stack.pop();\r
+ Object o2 = stack.pop();\r
+ double d1 = extractValue(o1);\r
+ double d2 = extractValue(o2);\r
+ stack.push(d2 / d1);\r
+ }\r
+\r
+ int countArguments(PArgList args) {\r
+ if (args == null)\r
+ return 0;\r
+ if (args instanceof ASingleArgList)\r
+ return 1;\r
+ ASequenceArgList seq = (ASequenceArgList) args;\r
+ return 1 + countArguments(seq.getArgList());\r
+ }\r
+\r
+ public void outAFunctionPrimary(AFunctionPrimary node) {\r
+ }\r
+\r
+}\r