1 package org.simantics.modeling.ui.expression;
\r
3 import java.util.HashMap;
\r
4 import java.util.Stack;
\r
6 import org.simantics.basicexpression.analysis.DepthFirstAdapter;
\r
7 import org.simantics.basicexpression.node.AAddressValue;
\r
8 import org.simantics.basicexpression.node.AConstantValue;
\r
9 import org.simantics.basicexpression.node.ADivMultiplicative;
\r
10 import org.simantics.basicexpression.node.AFunctionPrimary;
\r
11 import org.simantics.basicexpression.node.AMinusExpression;
\r
12 import org.simantics.basicexpression.node.AMultMultiplicative;
\r
13 import org.simantics.basicexpression.node.APlusExpression;
\r
14 import org.simantics.basicexpression.node.ARangeValue;
\r
15 import org.simantics.basicexpression.node.ARviValue;
\r
16 import org.simantics.basicexpression.node.ASequenceArgList;
\r
17 import org.simantics.basicexpression.node.ASingleArgList;
\r
18 import org.simantics.basicexpression.node.AStringValue;
\r
19 import org.simantics.basicexpression.node.PArgList;
\r
20 import org.simantics.db.ReadGraph;
\r
21 import org.simantics.db.exception.DatabaseException;
\r
22 import org.simantics.db.layer0.adapter.Function;
\r
23 import org.simantics.db.layer0.variable.Variable;
\r
25 public class BasicExpressionVisitor extends DepthFirstAdapter {
\r
27 public static final boolean DEBUG_APPLICATION = false;
\r
29 public static class ApplicationException extends Exception {
\r
31 private static final long serialVersionUID = 1L;
\r
33 public ApplicationException(String message) {
\r
39 final ReadGraph graph;
\r
40 final Variable property;
\r
42 Stack<Object> stack = new Stack<Object>();
\r
44 HashMap<String, Function> builtins = new HashMap<String, Function>();
\r
46 public BasicExpressionVisitor(ReadGraph graph, Variable property) {
\r
49 this.property = property;
\r
53 public Object getResult() {
\r
57 public void outAConstantValue(AConstantValue node) {
\r
58 // System.out.println("eval constant " + node);
\r
59 stack.push(Double.valueOf(node.toString()));
\r
62 public void outAStringValue(AStringValue node) {
\r
65 String value = node.toString();
\r
66 String rvi = value.substring(1, value.length() - 2).trim();
\r
67 Variable relative = property.browse(graph, rvi);
\r
68 stack.push(relative.getValue(graph));
\r
69 } catch (DatabaseException e) {
\r
76 public void outARviValue(ARviValue node) {
\r
79 String value = node.toString();
\r
80 String rvi = value.trim();
\r
81 // System.out.println("property=" + property.getURI(graph) + " " + property);
\r
82 // System.out.println("rvi=" + rvi);
\r
83 Variable relative = property.browse(graph, rvi);
\r
84 // System.out.println("relative=" + relative.getURI(graph));
\r
85 Object valueObject = relative.getValue(graph);
\r
86 // System.out.println("relative2=" + relative.getURI(graph) + " -> " + valueObject);
\r
87 stack.push(valueObject);
\r
88 } catch (DatabaseException e) {
\r
94 public void outAAddressValue(AAddressValue node) {
\r
95 stack.push('&' + node.getRange().toString());
\r
98 public void outARangeValue(ARangeValue node) {
\r
101 private double extractValue(Object o) {
\r
102 if (o instanceof Number) {
\r
103 return ((Number) o).doubleValue();
\r
104 } else if (o instanceof String) {
\r
105 return Double.valueOf((String) o);
\r
111 public void outAPlusExpression(APlusExpression node) {
\r
112 Object o1 = stack.pop();
\r
113 Object o2 = stack.pop();
\r
114 double d1 = extractValue(o1);
\r
115 double d2 = extractValue(o2);
\r
116 stack.push(d1 + d2);
\r
117 // System.out.println("plus " + d1 + " " + d2);
\r
120 public void outAMinusExpression(AMinusExpression node) {
\r
121 Object o2 = stack.pop();
\r
122 Object o1 = stack.pop();
\r
123 double d1 = extractValue(o1);
\r
124 double d2 = extractValue(o2);
\r
125 // System.out.println("minus " + d1 + " " + d2);
\r
126 stack.push(d1 - d2);
\r
129 public void outAMultMultiplicative(AMultMultiplicative node) {
\r
130 Object o1 = stack.pop();
\r
131 Object o2 = stack.pop();
\r
132 double d1 = extractValue(o1);
\r
133 double d2 = extractValue(o2);
\r
134 stack.push(d1 * d2);
\r
135 // System.out.println("mult " + d1 + " " + d2);
\r
139 public void outADivMultiplicative(ADivMultiplicative node) {
\r
140 Object o1 = stack.pop();
\r
141 Object o2 = stack.pop();
\r
142 double d1 = extractValue(o1);
\r
143 double d2 = extractValue(o2);
\r
144 stack.push(d2 / d1);
\r
147 int countArguments(PArgList args) {
\r
150 if (args instanceof ASingleArgList)
\r
152 ASequenceArgList seq = (ASequenceArgList) args;
\r
153 return 1 + countArguments(seq.getArgList());
\r
156 public void outAFunctionPrimary(AFunctionPrimary node) {
\r