Changeset 187 for trunk/blade/BladeRank.d
- Timestamp:
- 04/30/08 16:05:32 (4 years ago)
- Files:
-
- trunk/blade/BladeRank.d (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/blade/BladeRank.d
r172 r187 27 27 else if (s[i]==')') --paren; 28 28 if (paren==0 && s[i]==']') { 29 if (startIndex && hasSliced) return true; 29 if (startIndex && hasSliced) return true; 30 30 numbrack--; 31 if (s[i-1]=='[') { startIndex=false; } 31 if (s[i-1]=='[') { startIndex=false; } 32 32 } 33 33 if (paren==0 && s[i]=='[') { … … 36 36 numbrack++; 37 37 } 38 if (paren==0 && numbrack==1 && s[i]==',') { 38 if (paren==0 && numbrack==1 && s[i]==',') { 39 39 if (hasSliced && startIndex) return true; 40 40 if (maybeSlice) hasSliced = true; … … 83 83 enum RankError : int { 84 84 UnsupportedOperation = -1, 85 RankIncrement = -2, 85 RankIncrement = -2, 86 86 AttemptToIndexAScalar = -3, 87 87 NonScalarIndex = -4, 88 88 NonScalarSlice = -5, 89 89 DotDotExpected = -6, 90 CommaExpected = -7, 90 CommaExpected = -7, 91 91 RankMismatch = -8, 92 92 RankMismatchConcatenation = -9, … … 132 132 auto rrank = doVisit(this_, args[1]); 133 133 if (rrank<0) return rrank; // propagate errors 134 if (lrank!=1 || rrank!=1) return RankError.RankMismatchDotProduct; 134 if (lrank!=1 || rrank!=1) return RankError.RankMismatchDotProduct; 135 135 return 0; 136 136 case "sum": 137 case "prod": 137 138 auto lrank = doVisit(this_,args[0]); 138 139 if (lrank<0) return lrank; // propagate errors … … 146 147 assert(0, "BLADE ICE: Unsupported function:" ~ func); 147 148 return 0; 148 } 149 } 149 150 } 150 151 ReturnType onVisitPrefix(This this_, char [] op, char [] expr) { … … 159 160 return RankError.RankIncrement; 160 161 } 161 // Includes multi-dimensional slicing and indexing. 162 // Includes multi-dimensional slicing and indexing. 162 163 ReturnType onVisitIndex(This this_, char [] base, char [][2][] slices) { 163 164 int totrank = doVisit(this_, base); 164 165 for(int i=0; i<slices.length; ++i) { 165 166 int r = doVisit(this_,slices[i][0]); 166 if (r!=0) return (r<0)? r :RankError.NonScalarIndex; 167 if (r!=0) return (r<0)? r :RankError.NonScalarIndex; 167 168 if (slices[i][1]==""){ 168 169 --totrank; 169 170 } else { 170 171 r = doVisit(this_,slices[i][1]); 171 if (r!=0) return (r<0)?r:RankError.NonScalarSlice; 172 if (r!=0) return (r<0)?r:RankError.NonScalarSlice; 172 173 } 173 174 } … … 186 187 } 187 188 if (op=="~") { // concatentating scalars and vectors, or vectors and matrices, is permitted 188 if (lrank==rrank || lrank==(rrank+1) || rrank==(lrank+1)) 189 if (lrank==rrank || lrank==(rrank+1) || rrank==(lrank+1)) 189 190 return (lrank>rrank)? lrank: rrank; 190 191 else return RankError.RankMismatchConcatenation; … … 211 212 } 212 213 213 unittest { 214 unittest { 214 215 assert(exprRank("(A[B..C])[C]", "300")==2); 215 216 assert(exprRank("A+=(A[B..C])", "300")==3); 216 217 assert(exprRank("A+(B*C)", "000")==0); 217 218 assert(exprRank("A+(B*C)", "000")==0); 218 219 assert(exprRank("A=(B*C)", "202")==2); 219 220 assert(exprRank("B*=(C*A)", "010")==1); … … 221 222 assert(exprRank("D+=((A+C)*B)", "2022")==2); 222 223 assert(exprRank("D+=((A&C)*B)", "0101")==1); 223 224 224 225 assert(exprRank("C~=(((A[B])[B])~C)", "302")==2); 225 226 assert(exprRank("((D[E])[E])+(-((C[B])[B..E]))", "202300")==1); 226 227 227 228 assert(exprRank("A+((((++B)+D)--)*C)", "1010")==1); 228 229 229 230 assert(exprRank("C+=(A[B])", "302")==2); 230 231 assert(exprRank("dot(A)", "1")==RankError.CommaExpected); 231 232 assert(exprRank("dot(A,B)", "10")==RankError.RankMismatchDotProduct); 232 233 assert(exprRank("dot(B,(A*(dot(B,B))))", "11")==0); 234 233 234 assert(exprRank("dot(B,(A*(dot(B,B))))", "11")==0); 235 236 assert(exprRank("prod(A*B)", "10")==0); 237 235 238 assert(exprRank("A[B,B,B]", "60")==3); 236 239 assert(exprRank("A[B,B,C,B]", "600")==2); 237 240 assert(exprRank("A+=(B[C..$])", "110")==1); 238 241 assert(exprRank("A+=(B[C,D..$])", "2300")==2); 239 242 240 243 // bug fixes: 241 244 assert(exprRank("(A[B..$,C])+=D", "2001")==1);
