Ugly. A pile of new xxxFlags() functions, to communicate to the parser
that 'yield' is a keyword. This doesn't help test_generators at all! I
don't know why not. These things do work now (and didn't before this
patch):
1. "from __future__ import generators" now works in a native shell.
2. Similarly "python -i xxx.py" now has generators enabled in the
shell if xxx.py had them enabled.
3. This program (which was my doctest proxy) works fine:
from __future__ import generators
source = """\
def f():
yield 1
"""
exec compile(source, "", "single") in globals()
print type(f())
diff --git a/Parser/parsetok.c b/Parser/parsetok.c
index b68fbd7..6017e5f 100644
--- a/Parser/parsetok.c
+++ b/Parser/parsetok.c
@@ -13,13 +13,19 @@
/* Forward */
-static node *parsetok(struct tok_state *, grammar *, int, perrdetail *);
+static node *parsetok(struct tok_state *, grammar *, int, perrdetail *, int);
/* Parse input coming from a string. Return error code, print some errors. */
-
node *
PyParser_ParseString(char *s, grammar *g, int start, perrdetail *err_ret)
{
+ return PyParser_ParseStringFlags(s, g, start, err_ret, 0);
+}
+
+node *
+PyParser_ParseStringFlags(char *s, grammar *g, int start,
+ perrdetail *err_ret, int flags)
+{
struct tok_state *tok;
err_ret->error = E_OK;
@@ -42,7 +48,7 @@
tok->alterror++;
}
- return parsetok(tok, g, start, err_ret);
+ return parsetok(tok, g, start, err_ret, flags);
}
@@ -52,6 +58,14 @@
PyParser_ParseFile(FILE *fp, char *filename, grammar *g, int start,
char *ps1, char *ps2, perrdetail *err_ret)
{
+ return PyParser_ParseFileFlags(fp, filename, g, start, ps1, ps2,
+ err_ret, 0);
+}
+
+node *
+PyParser_ParseFileFlags(FILE *fp, char *filename, grammar *g, int start,
+ char *ps1, char *ps2, perrdetail *err_ret, int flags)
+{
struct tok_state *tok;
err_ret->error = E_OK;
@@ -72,14 +86,15 @@
}
- return parsetok(tok, g, start, err_ret);
+ return parsetok(tok, g, start, err_ret, flags);
}
/* Parse input coming from the given tokenizer structure.
Return error code. */
static node *
-parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret)
+parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
+ int flags)
{
parser_state *ps;
node *n;
@@ -90,6 +105,8 @@
err_ret->error = E_NOMEM;
return NULL;
}
+ if (flags & PyPARSE_YIELD_IS_KEYWORD)
+ ps->p_generators = 1;
for (;;) {
char *a, *b;