Index: Python/ast.c |
=================================================================== |
--- a/Python/ast.c |
+++ b/Python/ast.c |
@@ -1834,13 +1834,28 @@ ast_for_expr(struct compiling *c, const |
} |
return ast_for_binop(c, n); |
case yield_expr: { |
+ node *an = NULL; |
+ node *en = NULL; |
+ int is_from = 0; |
expr_ty exp = NULL; |
- if (NCH(n) == 2) { |
- exp = ast_for_testlist(c, CHILD(n, 1)); |
+ if (NCH(n) > 1) |
+ an = CHILD(n, 1); /* yield_arg */ |
+ if (an) { |
+ en = CHILD(an, NCH(an) - 1); |
+ if (NCH(an) == 2) { |
+ is_from = 1; |
+ exp = ast_for_expr(c, en); |
+ } |
+ else |
+ exp = ast_for_testlist(c, en); |
if (!exp) |
return NULL; |
} |
- return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena); |
+ return Yield(is_from, exp, LINENO(n), n->n_col_offset, c->c_arena); |
+ } |
+ case yield_from: { |
+ expr_ty exp = ast_for_expr(c, CHILD(n, 2)); |
+ return Yield(1, exp, LINENO(n), n->n_col_offset, c->c_arena); |
} |
case factor: |
if (NCH(n) == 1) { |
@@ -1864,7 +1879,7 @@ ast_for_call(struct compiling *c, const |
/* |
arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] |
| '**' test) |
- argument: [test '='] test [gen_for] # Really [keyword '='] test |
+ argument: [test '='] (test | yield_from) [gen_for] # Really [keyword '='] test |
*/ |
int i, nargs, nkeywords, ngens; |
@@ -2243,7 +2258,7 @@ ast_for_flow_stmt(struct compiling *c, c |
continue_stmt: 'continue' |
return_stmt: 'return' [testlist] |
yield_stmt: yield_expr |
- yield_expr: 'yield' testlist |
+ yield_expr: 'yield' testlist | 'yield' 'from' test |
raise_stmt: 'raise' [test [',' test [',' test]]] |
*/ |
node *ch; |