@@ -11,9 +11,9 @@ class EvaluationVisitor : IExpressionVisitor
1111
1212 public Traversal Traversal { get { return Traversal . None ; } }
1313
14- public EvaluationVisitor ( ISymbolManager symbolProvider )
14+ public EvaluationVisitor ( ISymbolManager symbolManager )
1515 {
16- _symbolManager = symbolProvider ;
16+ _symbolManager = symbolManager ;
1717 _evaluationStack = new Stack < Value > ( ) ;
1818 }
1919
@@ -37,8 +37,16 @@ public void Visit(BinaryExpression binaryExpression)
3737
3838 Value rightOperand = _evaluationStack . Pop ( ) ;
3939 Value leftOperand = _evaluationStack . Pop ( ) ;
40- bool isNumberLeft = leftOperand . IsFloatingPointNumber || leftOperand . IsInteger ;
41- bool isNumberRight = rightOperand . IsFloatingPointNumber || rightOperand . IsInteger ;
40+ bool isNumberLeft = leftOperand . IsDecimal || leftOperand . IsInteger ;
41+ bool isNumberRight = rightOperand . IsDecimal || rightOperand . IsInteger ;
42+
43+ switch ( binaryExpression . BinaryExpressionType )
44+ {
45+ case BinaryExpressionType . Addition :
46+ Value result = Value . Add ( leftOperand , rightOperand ) ;
47+ _evaluationStack . Push ( result ) ;
48+ return ;
49+ }
4250
4351 if ( isNumberLeft && isNumberRight )
4452 {
@@ -48,23 +56,20 @@ public void Visit(BinaryExpression binaryExpression)
4856
4957 switch ( binaryExpression . BinaryExpressionType )
5058 {
51- case BinaryExpressionType . Addition :
52- result = Value . FloatingPointNumber ( leftValue + rightValue ) ;
53- break ;
5459 case BinaryExpressionType . Substraction :
55- result = Value . FloatingPointNumber ( leftValue - rightValue ) ;
60+ result = Value . Decimal ( leftValue - rightValue ) ;
5661 break ;
5762 case BinaryExpressionType . Multiplication :
58- result = Value . FloatingPointNumber ( leftValue * rightValue ) ;
63+ result = Value . Decimal ( leftValue * rightValue ) ;
5964 break ;
6065 case BinaryExpressionType . Division :
61- result = Value . FloatingPointNumber ( leftValue / rightValue ) ;
66+ result = Value . Decimal ( leftValue / rightValue ) ;
6267 break ;
6368 case BinaryExpressionType . Power :
64- result = Value . FloatingPointNumber ( Math . Pow ( leftValue , rightValue ) ) ;
69+ result = Value . Decimal ( Math . Pow ( leftValue , rightValue ) ) ;
6570 break ;
6671 case BinaryExpressionType . Modulo :
67- result = Value . FloatingPointNumber ( leftValue % rightValue ) ;
72+ result = Value . Decimal ( leftValue % rightValue ) ;
6873 break ;
6974 case BinaryExpressionType . Equal :
7075 result = Value . Boolean ( leftValue == rightValue ) ;
@@ -107,7 +112,7 @@ public void Visit(PrefixExpression prefixExpression)
107112
108113 Value operand = _evaluationStack . Pop ( ) ;
109114
110- if ( operand . IsInteger || operand . IsFloatingPointNumber )
115+ if ( operand . IsInteger || operand . IsDecimal )
111116 {
112117 double value = operand . ToDouble ( ) ;
113118 double result ;
@@ -122,7 +127,7 @@ public void Visit(PrefixExpression prefixExpression)
122127 throw new EvaluationException ( message ) ;
123128 }
124129
125- _evaluationStack . Push ( Value . FloatingPointNumber ( result ) ) ;
130+ _evaluationStack . Push ( Value . Decimal ( result ) ) ;
126131 }
127132 else
128133 {
@@ -132,9 +137,16 @@ public void Visit(PrefixExpression prefixExpression)
132137 }
133138 }
134139
135- public void Visit ( ValueExpression numberExpression )
140+ public void Visit ( ValueExpression valueExpression )
136141 {
137- _evaluationStack . Push ( numberExpression . Value ) ;
142+ if ( valueExpression . Value . IsExpression )
143+ {
144+ valueExpression . Value . ToExpression ( ) . Expr . Accept ( this ) ;
145+ }
146+ else
147+ {
148+ _evaluationStack . Push ( valueExpression . Value ) ;
149+ }
138150 }
139151
140152 public void Visit ( CallExpression functionExpression )
@@ -197,13 +209,23 @@ public void Visit(TernaryExpression ternaryExpression)
197209
198210 public virtual void Visit ( VariableExpression variableExpression )
199211 {
200- if ( _symbolManager . IsSet ( variableExpression . Identifier ) )
212+ if ( _symbolManager != null && _symbolManager . IsSet ( variableExpression . Identifier ) )
201213 {
202- _evaluationStack . Push ( _symbolManager . Get ( variableExpression . Identifier ) ) ;
214+ // TODO decide whether this is good or not , do we want to evaluate like that?!
215+ Value value = _symbolManager . Get ( variableExpression . Identifier ) ;
216+
217+ if ( value . IsExpression )
218+ {
219+ value . ToExpression ( ) . Expr . Accept ( this ) ;
220+ }
221+ else
222+ {
223+ _evaluationStack . Push ( value ) ;
224+ }
203225 }
204226 else
205227 {
206- throw new EvaluationException ( "Unknown variable " + variableExpression . Identifier + "." ) ;
228+ _evaluationStack . Push ( Value . Expression ( new Expression ( variableExpression ) ) ) ;
207229 }
208230 }
209231
0 commit comments