Changeset 176
- Timestamp:
- 01/16/08 05:01:53 (6 months ago)
- Files:
-
- trunk/blade/Blade.d (modified) (3 diffs)
- trunk/blade/BladeVisitor.d (modified) (4 diffs)
- trunk/blade/SyntaxTree.d (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/blade/Blade.d
r173 r176 58 58 module blade.Blade; 59 59 60 public import blade.SyntaxTree : AbstractSyntaxTree, syntaxtreeof, AST, Symbol;60 public import blade.SyntaxTree : AbstractSyntaxTree, mixin_tupleAndSyntaxtreeof, AST, Symbol; 61 61 private import blade.BladeUtil : enquote, itoa; 62 62 private import blade.BladeRank : isStrided, exprRank; … … 75 75 { 76 76 debug (BladeFrontEnd) { 77 return `pragma(msg, \n ~ "// " __FILE__ ~ "(" ~__LINE__.stringof[0..$-1] ~ ") ` ~ enquote(expr) ~ `" ~ \n ~ makeVectorCode(` ~ syntaxtreeof(expr) ~ ")~\\n);"78 "mixin( makeVectorCode(" ~ syntaxtreeof(expr) ~ "));";77 return `pragma(msg, \n ~ "// " __FILE__ ~ "(" ~__LINE__.stringof[0..$-1] ~ ") ` ~ enquote(expr) ~ `" ~ \n ~ ` ~ mixin_tupleAndSyntaxtreeof("makeVectorCode", expr) ~ "~\\n);" 78 "mixin(" ~ mixin_tupleAndSyntaxtreeof("makeVectorCode", expr)~ ");"; 79 79 } else { 80 return "mixin( makeVectorCode(" ~ syntaxtreeof(expr) ~ "));";81 } 82 } 80 return "mixin(" ~ mixin_tupleAndSyntaxtreeof("makeVectorCode", expr)~ ");"; 81 } 82 } 83 83 84 84 // Simplify the expression, categorise it, 85 85 // and dispatch to the appropriate code generator. 86 char [] makeVectorCode( AbstractSyntaxTree tree)86 char [] makeVectorCode(Types...)(AbstractSyntaxTree tree) 87 87 { 88 88 RevisedExpression revised = simplifySyntaxTree(tree); … … 363 363 int firstVector = findVectorForLength(tree); 364 364 result ~= getValueForSymbol(tree.mapping[firstVector], tree).invoker ~ ".length"; 365 // result ~= tree.symbolTable[firstVector].value ~ ".length";366 365 result ~= vals; 367 366 trunk/blade/BladeVisitor.d
r175 r176 20 20 V.ReturnType beginVisit(V)(V visitor, char [] expr) 21 21 { 22 if ( exprLength(expr)==expr.length) {23 return doVisit(visitor, expr); //22 if (isSimpleExpr(expr)) { 23 return doVisit(visitor, expr); 24 24 } else return doVisit(visitor, "(" ~ expr ~ ")"); 25 25 } … … 127 127 } 128 128 129 // Return true if the function is a single variable, or an intrinsic. 130 bool isSimpleExpr(char [] s) 131 { 132 if (s.length==1) return true; 133 if (s[0]<'a' || s[0]>'z') return false; 134 return exprLength(s)==s.length; 135 } 136 129 137 unittest { 130 138 assert(exprLength("A*B")==1); … … 142 150 bool expressionContainsAssignment(char [] expr) 143 151 { 152 if (isSimpleExpr(expr)) return false; 144 153 // BUG: also need to deal with comma, ?:, &&, ||, is, !is, in, 145 154 // unary &, unary ! 146 155 if (expr.length>1 && expr[0]=='(') expr = expr[1..$-1]; 147 else if (expr.length==1 && ((expr[0]>='A' && expr[0]<='Z') || expr[0]=='$')){148 return false;149 }150 if (expr.length>3 && (expr[0]>='a' && expr[1]<='z')) { // function151 return false;152 }153 156 if (expr.length>2 && (expr[0..2]=="++" || expr[0..2]=="--")) { 154 157 return false; … … 158 161 } 159 162 if (expr.length>2 && (expr[$-2..$]=="++" || expr[$-2..$]=="--")) { 160 return false; // BUG: actually this isan assignment163 return false; // BUG: actually this _is_ an assignment 161 164 } 162 165 int y = exprLength(expr); trunk/blade/SyntaxTree.d
r173 r176 62 62 { 63 63 char [][] symbols = replaceSymbolsWithPlaceholders(expression); 64 char [] result = `AbstractSyntaxTree(` ~ mixin_getPrecedence(expression) ~ `,[`;64 char [] result = `AbstractSyntaxTree(` ~ mixin_getPrecedence(expression) ~ `,[`; 65 65 66 66 for(int i=0; i<symbols.length; ++i) { 67 if (i>0) result ~= ",";67 if (i>0) result ~= ","; 68 68 result ~= `Symbol(` ~ mixin_typeOf(symbols[i]) 69 69 ~ `,` ~ mixin_valueOf(symbols[i]) … … 74 74 result ~="])"; 75 75 return `mixin("` ~ enquote(result) ~ `")`; 76 } 77 78 /** 79 * As for syntaxtreeof(), except that it creates a tuple as well as the abstract syntax tree 80 */ 81 char [] mixin_tupleAndSyntaxtreeof(char [] funcname, char [] expression) 82 { 83 char [][] symbols = replaceSymbolsWithPlaceholders(expression); 84 char [] result = `AbstractSyntaxTree(` ~ mixin_getPrecedence(expression) ~ `,[`; 85 char [] tuple; 86 87 for(int i=0; i<symbols.length; ++i) { 88 if (i>0) { 89 result ~= ","; 90 tuple ~= ","; 91 } 92 result ~= `Symbol(` ~ mixin_typeOf(symbols[i]) 93 ~ `,` ~ mixin_valueOf(symbols[i]) 94 ~ `,` ~ mixin_rankOf(symbols[i]) 95 ~ `,` ~ mixin_elementOf(symbols[i]) ~ `)`; 96 tuple ~= mixin_typeOfOrVoid(symbols[i]); 97 } 98 99 result ~="])"; 100 return funcname ~ `!(mixin("` ~ enquote(tuple) ~ `"))(mixin("` ~ enquote(result) ~ `"))`; 76 101 } 77 102 … … 314 339 } 315 340 341 char [] mixin_typeOfOrVoid(char [] sym) 342 { 343 // If sym is a function, we take its address, since 344 // typeof(x).stringof doesn't compile if x is a function. 345 // If sym doesn't compile at all, return "void". 346 return `mixin(!is(typeof(` ~ sym ~ `))?"\"void\"" : is(typeof(` ~ sym ~ `)==function)?"` ~ enquote("typeof(&" ~ sym ~ ").stringof")~`":"` ~ enquote("typeof(" ~ sym ~ ").stringof") ~ `")`; 347 } 348 316 349 // Returns sym.stringof, with workarounds for compiler bugs 317 350 char [] mixin_valueOf(char [] sym) … … 347 380 ~ s ~ `[0][0][0]":"` ~ s ~ `[0][0]":"` ~ s ~ `[0]":"` ~ s ~ `")`); 348 381 } 349 350 382 351 383 // ==== TESTS ==== … … 366 398 assert(mixin(mixin_getPrecedence("(A+B) in(C^D)"))=="(A+B)in(C^D)"); 367 399 assert(mixin(mixin_getPrecedence("A"))=="A"); 400 assert(mixin(mixin_getPrecedence("--A"))=="--A"); 401 // assert(mixin(mixin_getPrecedence("A--"))=="A--"); // BUG: fails 368 402 369 403 assert(mixin(mixin_getPrecedence("A[B,[C,D]]"))=="A[B,([C,D])]");
