mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
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())
This commit is contained in:
parent
e75785a646
commit
fe2127d3cb
5 changed files with 69 additions and 18 deletions
|
@ -13,12 +13,18 @@ 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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -51,6 +57,14 @@ PyParser_ParseString(char *s, grammar *g, int start, perrdetail *err_ret)
|
|||
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;
|
||||
|
||||
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue