@@ -28,7 +28,7 @@ namespace MicroModelica {
2828using namespace IR ;
2929namespace Util {
3030
31- ParseIndex::ParseIndex () : _constant(0 ), _factor(1 ), _variable() {}
31+ ParseIndex::ParseIndex () : _constant(0 ), _factor(1 ), _variable(), _u_minus( 1 ), _minus_sign( 1 ) {}
3232
3333int ParseIndex::constant () { return _constant; }
3434
@@ -57,6 +57,7 @@ AST_Expression ParseIndex::foldTraverseElement(AST_Expression exp)
5757 }
5858 } else {
5959 _variable = cr->name ();
60+ _factor *= _u_minus;
6061 }
6162 break ;
6263 }
@@ -67,24 +68,33 @@ AST_Expression ParseIndex::foldTraverseElement(AST_Expression exp)
6768 foreach (it, outputs) {
6869 apply (current_element (it));
6970 }
71+ break ;
7072 }
7173 case EXPINTEGER :
7274 _constant = exp->getAsInteger ()->val ();
75+ break ;
7376 default :
7477 break ;
7578 }
7679 return exp;
7780}
7881
79- // @TODO: review if this is needed.
80- AST_Expression ParseIndex::foldTraverseElementUMinus (AST_Expression exp) { return apply (exp->getAsUMinus ()->exp ()); }
82+ AST_Expression ParseIndex::foldTraverseElementUMinus (AST_Expression exp)
83+ {
84+ _u_minus = -1 ;
85+ AST_Expression ret = newAST_Expression_UnaryMinus (apply (exp->getAsUMinus ()->exp ()));
86+ _u_minus = 1 ;
87+ return ret;
88+ }
8189
8290int ParseIndex::getConstant (AST_Expression left, AST_Expression right)
8391{
8492 if (left->expressionType () == EXPINTEGER ) {
93+ _minus_sign = 1 ;
8594 return left->getAsInteger ()->val ();
8695 }
8796 if (right->expressionType () == EXPINTEGER ) {
97+ _minus_sign = -1 ;
8898 return right->getAsInteger ()->val ();
8999 }
90100 assert (false );
@@ -95,13 +105,14 @@ AST_Expression ParseIndex::foldTraverseElement(AST_Expression l, AST_Expression
95105{
96106 switch (bot) {
97107 case BINOPADD :
98- _constant = getConstant (l, r);
108+ _constant = _u_minus * getConstant (l, r);
99109 break ;
100110 case BINOPSUB :
101- _constant = -1 * getConstant (l, r);
111+ _constant = _u_minus * _minus_sign * getConstant (l, r);
112+ _factor = _minus_sign * -1 ;
102113 break ;
103114 case BINOPMULT :
104- _factor = getConstant (l, r);
115+ _factor = _u_minus * getConstant (l, r);
105116 break ;
106117 default :
107118 break ;
0 commit comments