Changeset 164
- Timestamp:
- 12/18/07 01:03:09 (10 months ago)
- Files:
-
- trunk/blade/BladeSimplify.d (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/blade/BladeSimplify.d
r163 r164 147 147 char [] e = ""; 148 148 for (int i=0; i<s.length; ++i) { 149 if (s[i]==' ') {149 if (s[i]=='{') { 150 150 int k; 151 for (k=i+1; s[k]!=' '; ++k) {} 152 char [] newexpr = s[i+2..k-1]; // strip off the {} 153 151 int bracecount=1; 152 for (k=i+1; bracecount>0; ++k) { 153 if (s[k]=='{') ++bracecount; 154 if (s[k]=='}') --bracecount; 155 } 156 --k; 157 char [] newexpr = s[i+1..k]; // strip off the {} 154 158 int newi = k; 155 if (i> 0 && k<s.length&& s[i-1]=='(' && s[k+1]==')') {159 if (i>1 && k<s.length-1 && s[i-1]=='(' && s[k+1]==')') { 156 160 e = e[0..$-1]; // remove the last '(' 157 161 newi=k+1; // don't add ')' … … 163 167 e ~= next; 164 168 ++next; 165 comp ~= s[i+ 2..k-1]; // strip off the {}166 if (s[k- 2]==']') {169 comp ~= s[i+1..k]; // strip off the {} 170 if (s[k-1]==']') { 167 171 // it's a vector/matrix of some kind, with rank reduced 168 172 // by indices. Can't just use exprRank, because the [] 169 173 // aren't wrapped by (). 170 r ~= (rank[s[i+ 2]-'A'] - indexRank(s[i+2..k-1]));174 r ~= (rank[s[i+1]-'A'] - indexRank(s[i+1..k])); 171 175 } else { 172 176 // it's a scalar expression. Note that it could involve … … 475 479 return ScalarFold("",combineMul(left.expr ~ createMultiSlice(slices), left.multiplier)); 476 480 } else 477 return ScalarFold(" {" ~ left.expr ~ createMultiSlice(slices)~ "}", left.multiplier);481 return ScalarFold("{" ~ left.expr ~ createMultiSlice(slices)~ "}", left.multiplier); 478 482 } 479 483 ReturnType onVisitBinaryOp(This this_, char [] op, char [] left, char [] right) { … … 483 487 assert(first.multiplier=="" && second.expr=="", "BLADE ICE"); 484 488 assert(second.multiplier!="-", "BLADE ICE"); // this would be a*=-b, where b is a vector 485 if (second.multiplier.length>1) return ScalarFold(wrapInParens(first.expr) ~ op ~ " {" ~ wrapInParens(second.multiplier) ~ "}","");489 if (second.multiplier.length>1) return ScalarFold(wrapInParens(first.expr) ~ op ~ "{" ~ wrapInParens(second.multiplier) ~ "}",""); 486 490 else return ScalarFold(wrapInParens(first.expr) ~ op ~ wrapInParens(second.multiplier),""); 487 491 } … … 543 547 if (right=="-") return "-" ~ wrapInParens(left); 544 548 if (right.length==1) return wrapInParens(left) ~ "*" ~ right; 545 return wrapInParens(left) ~ "* {" ~ wrapInParens(right) ~ "}";549 return wrapInParens(left) ~ "*{" ~ wrapInParens(right) ~ "}"; 546 550 } 547 551 … … 550 554 ScalarFold f = beginVisit(ScalarFoldingVisitor(ranks), expr); 551 555 if (f.multiplier=="") return f.expr; 552 else if (f.expr=="") return " {" ~ f.multiplier ~ "}";556 else if (f.expr=="") return "{" ~ f.multiplier ~ "}"; 553 557 else return combineMulWithCompound(f.expr, f.multiplier); 554 558 } 555 559 556 560 unittest { 557 assert(foldScalars("A*=(B*C)", "100")== "A*= {(B*C)}");558 assert(foldScalars("d(A,(A*d(A,A)))", "1")==" {(d(A,A))*(d(A,A))}");559 assert(foldScalars("A-(B*C)", "101")=="A+(C* {(-B)})");560 assert(foldScalars("A-(B*(-C))", "101")=="A+(C* {(-(-B))})");561 assert(foldScalars("A*=(B*C)", "100")=="A*={(B*C)}"); 562 assert(foldScalars("d(A,(A*d(A,A)))", "1")=="{(d(A,A))*(d(A,A))}"); 563 assert(foldScalars("A-(B*C)", "101")=="A+(C*{(-B)})"); 564 assert(foldScalars("A-(B*(-C))", "101")=="A+(C*{(-(-B))})"); 561 565 assert(foldScalars("A+(-C)", "101")=="A-C"); 562 566 assert(foldScalars("A-(-C)", "101")=="A+C"); 563 567 assert(foldScalars("(-A)-(-C)", "101")=="C-A"); 564 assert(foldScalars("A*=-(-B)", "10")=="A*= {(-(-B))}");565 } 568 assert(foldScalars("A*=-(-B)", "10")=="A*={(-(-B))}"); 569 }
