Changeset 147

Show
Ignore:
Timestamp:
11/27/07 12:29:02 (9 months ago)
Author:
Don Clugston
Message:

Support array literals.

Files:

Legend:

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

    r145 r147  
    5555// FOR MIXIN: Generate code to evaluate the given vector expression. 
    5656char [] vectorize(char [] expr) 
    57 { 
     57{     
    5858    debug (BladeFrontEnd) { 
    5959    return `pragma(msg, \n ~ "// " __FILE__ ~ "(" ~__LINE__.stringof[0..$-1] ~ ") ` ~ enquote(expr) ~ `" ~ \n ~ makeVectorCode(` ~ syntaxtreeof(expr) ~ ")~\\n);"     
  • trunk/blade/BladeRank.d

    r146 r147  
    176176            if (rrank!=0) return RankError.NonScalarIndex; 
    177177            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            } 
    178192        } else { 
    179193            // slicing -- does not change the rank 
     
    218232} 
    219233 
    220 unittest { 
     234unittest {     
    221235    assert(exprRank("A+((((++B)+D)--)*C)", "1010")==1); 
    222236    assert(exprRank("A+(B*C)", "000")==0); 
     
    234248    assert(exprRank("d(A,B)", "10")==RankError.RankMismatchDotProduct); 
    235249    assert(exprRank("d(B,(A*(d(B,B))))", "11")==0); 
     250//    assert(exprRank("A[B,B,B]", "6034")==3); 
    236251} 
    237252 
  • trunk/blade/BladeSimplify.d

    r146 r147  
    225225} 
    226226 
     227// Allows [a,[b,c],d] syntax for indices, where [b,c] is a range. 
    227228int indexRank(char [] s) 
    228229{ 
    229230   int r=0; 
    230231   int numbrack=0; 
     232   int paren = 0; 
    231233   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]=='[') { 
    234238            if (numbrack==0) ++r; 
    235239            numbrack++; 
    236240        } 
    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]=='.') { 
    238244            // if it's a slice, it does not increase the rank 
    239245             r--; 
  • trunk/blade/SyntaxTree.d

    r145 r147  
    276276    preOp!("++") opAddAssign(T:int=int)(int x){ return null; } 
    277277    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; }     
    280285    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; } 
    281288    AST!("(" ~ text ~ "(" ~ AllText!(T) ~ "))") opCall(T...)(T){ return null; } 
    282     AST!("((" ~ text ~ "[" ~ AllText!(T) ~ "])=" ~ U.text ~ ")") opIndexAssign(U, T...)(U,T){ return null; } 
    283289 
    284290    // Avoid infinite recursion by templating these functions. 
     
    323329{ 
    324330    if (expr.length<2) return "`" ~ expr ~ "`"; 
     331    bool lastWasSymbol=false; // hack for array literals 
    325332    char [] code = "typeof("; 
    326333        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            } 
    329346        } 
    330347    return code ~ ").text[1..$-1]"; // remove the outer () 
     
    393410    assert(mixin(mixin_getPrecedence("(A+B)  in(C^D)"))=="(A+B)in(C^D)"); 
    394411    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