diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-07-16 05:37:24 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-07-16 05:37:24 (GMT) |
commit | fe2127d3cbf34452a10b88c40e5ab06870936f94 (patch) | |
tree | f8dc5d80679d9003646e666f1f3d9253f7ae13bb /Parser | |
parent | e75785a646d2cb4004187772f1df3bc5d474a77f (diff) | |
download | cpython-fe2127d3cbf34452a10b88c40e5ab06870936f94.zip cpython-fe2127d3cbf34452a10b88c40e5ab06870936f94.tar.gz cpython-fe2127d3cbf34452a10b88c40e5ab06870936f94.tar.bz2 |
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())
Diffstat (limited to 'Parser')
-rw-r--r-- | Parser/parsetok.c | 27 |
1 files changed, 22 insertions, 5 deletions
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 @@ int Py_TabcheckFlag; /* 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 @@ PyParser_ParseString(char *s, grammar *g, int start, perrdetail *err_ret) tok->alterror++; } - return parsetok(tok, g, start, err_ret); + return parsetok(tok, g, start, err_ret, flags); } @@ -52,6 +58,14 @@ node * 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 @@ PyParser_ParseFile(FILE *fp, char *filename, grammar *g, int start, } - 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 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret) err_ret->error = E_NOMEM; return NULL; } + if (flags & PyPARSE_YIELD_IS_KEYWORD) + ps->p_generators = 1; for (;;) { char *a, *b; |