]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/expression/BasicExpressionVisitor.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / expression / BasicExpressionVisitor.java
1 package org.simantics.modeling.ui.expression;\r
2 \r
3 import java.util.HashMap;\r
4 import java.util.Stack;\r
5 \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
24 \r
25 public class BasicExpressionVisitor extends DepthFirstAdapter {\r
26 \r
27     public static final boolean DEBUG_APPLICATION = false;\r
28     \r
29         public static class ApplicationException extends Exception {\r
30 \r
31                 private static final long serialVersionUID = 1L;\r
32 \r
33                 public ApplicationException(String message) {\r
34                         super(message);\r
35                 }\r
36 \r
37         }\r
38 \r
39         final ReadGraph graph;\r
40         final Variable property;\r
41         \r
42         Stack<Object> stack = new Stack<Object>();\r
43 \r
44         HashMap<String, Function> builtins = new HashMap<String, Function>();\r
45 \r
46         public BasicExpressionVisitor(ReadGraph graph, Variable property) {\r
47 \r
48                 this.graph = graph;\r
49                 this.property = property;\r
50                 \r
51         }\r
52 \r
53         public Object getResult() {\r
54                 return stack.pop();\r
55         }\r
56 \r
57         public void outAConstantValue(AConstantValue node) {\r
58                 // System.out.println("eval constant " + node);\r
59                 stack.push(Double.valueOf(node.toString()));\r
60         }\r
61 \r
62         public void outAStringValue(AStringValue node) {\r
63 \r
64                 try {\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
70                         stack.push(e);\r
71                 }\r
72                 \r
73         }\r
74 \r
75         @Override\r
76         public void outARviValue(ARviValue node) {\r
77                 \r
78                 try {\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
89                         stack.push(e);\r
90                 }\r
91                 \r
92         }\r
93         \r
94         public void outAAddressValue(AAddressValue node) {\r
95                 stack.push('&' + node.getRange().toString());\r
96         }\r
97 \r
98         public void outARangeValue(ARangeValue node) {\r
99         }\r
100 \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
106                 } else {\r
107                         return Double.NaN;\r
108                 }\r
109         }\r
110 \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
118         }\r
119 \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
127         }\r
128 \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
136         }\r
137         \r
138         @Override\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
145         }\r
146 \r
147         int countArguments(PArgList args) {\r
148                 if (args == null)\r
149                         return 0;\r
150                 if (args instanceof ASingleArgList)\r
151                         return 1;\r
152                 ASequenceArgList seq = (ASequenceArgList) args;\r
153                 return 1 + countArguments(seq.getArgList());\r
154         }\r
155 \r
156         public void outAFunctionPrimary(AFunctionPrimary node) {\r
157         }\r
158 \r
159 }\r