added array comprehension support

This commit is contained in:
Nicolas Cannasse
2014-10-01 18:52:19 +02:00
parent 1010329582
commit b884961431
+32
View File
@@ -74,6 +74,7 @@ class Parser {
var char : Int;
var ops : Array<Bool>;
var idents : Array<Bool>;
var uid : Int = 0;
#if hscriptPos
var readPos : Int;
@@ -144,6 +145,7 @@ class Parser {
public function parseString( s : String ) {
line = 1;
uid = 0;
return parse( new haxe.io.StringInput(s) );
}
@@ -365,12 +367,42 @@ class Parser {
if( tk == TComma )
tk = token();
}
if( a.length == 1 )
switch( expr(a[0]) ) {
case EFor(_), EWhile(_):
var tmp = "__a_" + (uid++);
var e = mk(EBlock([
mk(EVar(tmp, null, mk(EArrayDecl([]), p1)), p1),
mapCompr(tmp, a[0]),
mk(EIdent(tmp),p1),
]),p1);
return parseExprNext(e);
default:
}
return parseExprNext(mk(EArrayDecl(a),p1));
default:
return unexpected(tk);
}
}
function mapCompr( tmp : String, e : Expr ) {
var edef = switch( expr(e) ) {
case EFor(v, it, e2):
EFor(v, it, mapCompr(tmp, e2));
case EWhile(cond, e2):
EWhile(cond, mapCompr(tmp, e2));
case EIf(cond, e1, e2) if( e2 == null ):
EIf(cond, mapCompr(tmp, e1), null);
case EBlock([e]):
EBlock([mapCompr(tmp, e)]);
case EParent(e2):
EParent(mapCompr(tmp, e2));
default:
ECall( mk(EField(mk(EIdent(tmp), pmin(e), pmax(e)), "push"), pmin(e), pmax(e)), [e]);
}
return mk(edef, pmin(e), pmax(e));
}
function makeUnop( op, e ) {
return switch( expr(e) ) {
case EBinop(bop, e1, e2): mk(EBinop(bop, makeUnop(op, e1), e2), pmin(e1), pmax(e2));