Changeset 164

Show
Ignore:
Timestamp:
12/18/07 01:03:09 (10 months ago)
Author:
Don Clugston
Message:

Use { to delimit compounds - no space. Allows them to be nested.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/blade/BladeSimplify.d

    r163 r164  
    147147    char [] e = ""; 
    148148    for (int i=0; i<s.length; ++i) { 
    149         if (s[i]==' ') { 
     149        if (s[i]=='{') { 
    150150            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 {}             
    154158            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]==')') { 
    156160                e = e[0..$-1]; // remove the last '(' 
    157161                newi=k+1; // don't add ')' 
     
    163167                e ~= next; 
    164168                ++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]==']') {                 
    167171                    // it's a vector/matrix of some kind, with rank reduced 
    168172                    // by indices. Can't just use exprRank, because the [] 
    169173                    // 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])); 
    171175                } else { 
    172176                    // it's a scalar expression. Note that it could involve 
     
    475479            return ScalarFold("",combineMul(left.expr ~ createMultiSlice(slices), left.multiplier)); 
    476480        } else 
    477         return ScalarFold(" {" ~ left.expr ~ createMultiSlice(slices)~ "} ", left.multiplier); 
     481        return ScalarFold("{" ~ left.expr ~ createMultiSlice(slices)~ "}", left.multiplier); 
    478482    } 
    479483    ReturnType onVisitBinaryOp(This this_, char [] op, char [] left, char [] right) { 
     
    483487            assert(first.multiplier=="" && second.expr=="", "BLADE ICE"); 
    484488            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) ~ "}","");  
    486490            else return ScalarFold(wrapInParens(first.expr) ~ op ~ wrapInParens(second.multiplier),"");  
    487491        } 
     
    543547    if (right=="-") return "-" ~ wrapInParens(left);     
    544548    if (right.length==1) return wrapInParens(left) ~ "*" ~ right; 
    545     return wrapInParens(left) ~ "* {" ~ wrapInParens(right) ~ "} ";     
     549    return wrapInParens(left) ~ "*{" ~ wrapInParens(right) ~ "}";     
    546550} 
    547551 
     
    550554    ScalarFold f = beginVisit(ScalarFoldingVisitor(ranks), expr); 
    551555    if (f.multiplier=="") return f.expr; 
    552     else if (f.expr=="") return " {" ~ f.multiplier ~ "} "; 
     556    else if (f.expr=="") return "{" ~ f.multiplier ~ "}"; 
    553557    else return combineMulWithCompound(f.expr, f.multiplier); 
    554558} 
    555559 
    556560unittest { 
    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))})"); 
    561565    assert(foldScalars("A+(-C)", "101")=="A-C"); 
    562566    assert(foldScalars("A-(-C)", "101")=="A+C"); 
    563567    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}