Changeset 147
- Timestamp:
- 11/27/07 12:29:02 (9 months ago)
- Files:
-
- trunk/blade/Blade.d (modified) (1 diff)
- trunk/blade/BladeRank.d (modified) (3 diffs)
- trunk/blade/BladeSimplify.d (modified) (1 diff)
- trunk/blade/SyntaxTree.d (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/blade/Blade.d
r145 r147 55 55 // FOR MIXIN: Generate code to evaluate the given vector expression. 56 56 char [] vectorize(char [] expr) 57 { 57 { 58 58 debug (BladeFrontEnd) { 59 59 return `pragma(msg, \n ~ "// " __FILE__ ~ "(" ~__LINE__.stringof[0..$-1] ~ ") ` ~ enquote(expr) ~ `" ~ \n ~ makeVectorCode(` ~ syntaxtreeof(expr) ~ ")~\\n);" trunk/blade/BladeRank.d
r146 r147 176 176 if (rrank!=0) return RankError.NonScalarIndex; 177 177 return lrank - 1; 178 } else if (right[z+1]==',') { 179 int totrank = lrank; 180 for (;;) { 181 int rrank = subexprRank(right[0..z+1], rank); 182 if (rrank<0) return rrank; 183 if (rrank>1) return RankError.NonScalarIndex; 184 if (rrank==0) --totrank; 185 186 if (z==right.length-1) return totrank; 187 right = right[z+2..$]; 188 189 z = exprLength(right); 190 //assert(0, right[0..z+1]~ "#" ~right[z+2..$]); 191 } 178 192 } else { 179 193 // slicing -- does not change the rank … … 218 232 } 219 233 220 unittest { 234 unittest { 221 235 assert(exprRank("A+((((++B)+D)--)*C)", "1010")==1); 222 236 assert(exprRank("A+(B*C)", "000")==0); … … 234 248 assert(exprRank("d(A,B)", "10")==RankError.RankMismatchDotProduct); 235 249 assert(exprRank("d(B,(A*(d(B,B))))", "11")==0); 250 // assert(exprRank("A[B,B,B]", "6034")==3); 236 251 } 237 252 trunk/blade/BladeSimplify.d
r146 r147 225 225 } 226 226 227 // Allows [a,[b,c],d] syntax for indices, where [b,c] is a range. 227 228 int indexRank(char [] s) 228 229 { 229 230 int r=0; 230 231 int numbrack=0; 232 int paren = 0; 231 233 for(int i=1; i<s.length; ++i) { 232 if (s[i]==']') { numbrack--; if (s[i-1]=='[') --r; } 233 if (s[i]=='[') { 234 if (s[i]=='(') ++paren; 235 else if (s[i]==')') --paren; 236 if (paren==0 && s[i]==']') { numbrack--; if (s[i-1]=='[') --r; } 237 if (paren==0 && s[i]=='[') { 234 238 if (numbrack==0) ++r; 235 239 numbrack++; 236 240 } 237 if (numbrack==1 && s[i]=='.' && s[i-1]=='.') { 241 if (paren==0 && numbrack==1 && s[i]==',') ++r; // commas increase the rank 242 if (paren==0 && numbrack==2 && s[i]==',') --r; // slices commas don't increase rank. 243 if (paren==0 && numbrack==1 && s[i]=='.' && s[i-1]=='.') { 238 244 // if it's a slice, it does not increase the rank 239 245 r--; trunk/blade/SyntaxTree.d
r145 r147 276 276 preOp!("++") opAddAssign(T:int=int)(int x){ return null; } 277 277 preOp!("--") opSubAssign(T:int=int)(int x){ return null; } 278 279 AST!("(" ~ text ~ "[" ~ T.text ~ ".." ~ U.text ~"])") opSlice(T, U)(T x, U y){ return null; } 278 /* 279 static if (text.length==0) { 280 AST!("[" ~ T.text ~ ".." ~ U.text ~ "]") opSlice(T, U)(T x, U y){ return null; } 281 AST!("[" ~ AllText!(T) ~ "]") opIndex(T...)(T x){ return null; } 282 } else { 283 */ 284 AST!("(" ~ text ~ "[" ~ T.text ~ ".." ~ U.text ~ "])") opSlice(T, U)(T x, U y){ return null; } 280 285 AST!("(" ~ text ~ "[" ~ AllText!(T) ~ "])") opIndex(T...)(T x){ return null; } 286 // } 287 AST!("((" ~ text ~ "[" ~ AllText!(T) ~ "])=" ~ U.text ~ ")") opIndexAssign(U, T...)(U,T){ return null; } 281 288 AST!("(" ~ text ~ "(" ~ AllText!(T) ~ "))") opCall(T...)(T){ return null; } 282 AST!("((" ~ text ~ "[" ~ AllText!(T) ~ "])=" ~ U.text ~ ")") opIndexAssign(U, T...)(U,T){ return null; }283 289 284 290 // Avoid infinite recursion by templating these functions. … … 323 329 { 324 330 if (expr.length<2) return "`" ~ expr ~ "`"; 331 bool lastWasSymbol=false; // hack for array literals 325 332 char [] code = "typeof("; 326 333 for(int i=0; i<expr.length; ++i) { 327 if (expr[i]>='A' && expr[i]<='Z' || expr[i]=='$') code ~= "(cast(AST!(`" ~ expr[i] ~"`))(null))"; 328 else code ~= expr[i]; 334 if (expr[i]>='A' && expr[i]<='Z' || expr[i]=='$') { 335 code ~= "(cast(AST!(`" ~ expr[i] ~"`))(null))"; 336 lastWasSymbol = true; 337 } else { 338 if (!lastWasSymbol && expr[i]=='[') { 339 code ~= "(cast(AST!(``))(null))"; 340 } 341 if (expr[i]!=' ' && expr[i]!='\t' && expr[i]!='\r' 342 && expr[i]!= '\n' && expr[i]!=')') lastWasSymbol = false; 343 if (expr[i]==']') lastWasSymbol=true; 344 code ~= expr[i]; 345 } 329 346 } 330 347 return code ~ ").text[1..$-1]"; // remove the outer () … … 393 410 assert(mixin(mixin_getPrecedence("(A+B) in(C^D)"))=="(A+B)in(C^D)"); 394 411 assert(mixin(mixin_getPrecedence("A"))=="A"); 395 } 412 413 assert(mixin(mixin_getPrecedence("A[B,[C,D]]"))=="A[B,([C,D])]"); 414 assert(mixin(mixin_getPrecedence("A[B][C,D]"))=="(A[B])[C,D]"); 415 assert(mixin(mixin_getPrecedence("A[B,([C,D])]"))=="A[B,([C,D])]"); 416 assert(mixin(mixin_getPrecedence("A([B,C])"))=="A(([B,C]))"); 417 }
