- e1 = parseExpr(null, -1);
- if (getToken() != SEMI) throw new Error("expected ;");
- e2 = parseExpr(null, -1);
- if (getToken() != SEMI) throw new Error("expected ;");
- e3 = parseExpr(null, -1); // FIXME: this guy has to be okay with ending via a )
- if (getToken() != RP) throw new Error("expected right paren");
- throw new Error("not yet implemented");
- //return new Expr(FOR, e1, e2, e3, parseBlock(false));
+ e1 = parseMaximalExpr(null, -1);
+ if (e1.code == NAME && peekToken() == IN) {
+ getToken();
+ e2 = parseMaximalExpr(null, -1);
+ if (getToken() != RP) throw new Error("expected right paren");
+ return new Expr(FOR, new Expr(IN, e1, e2), parseBlock(false));
+
+ } else {
+ if (getToken() != SEMI) throw new Error("expected ;");
+ e2 = parseMaximalExpr(null, -1);
+ if (getToken() != SEMI) throw new Error("expected ;");
+ e3 = parseMaximalExpr(null, -1);
+ if (getToken() != RP) throw new Error("expected right paren");
+ return new Expr(LC, e1, new Expr(WHILE, e2, new Expr(LC, parseBlock(false), e3)));
+ }