summaryrefslogtreecommitdiff
path: root/Parser
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-07-16 05:37:24 +0000
committerTim Peters <tim.peters@gmail.com>2001-07-16 05:37:24 +0000
commitfe2127d3cbf34452a10b88c40e5ab06870936f94 (patch)
treef8dc5d80679d9003646e666f1f3d9253f7ae13bb /Parser
parente75785a646d2cb4004187772f1df3bc5d474a77f (diff)
downloadcpython-git-fe2127d3cbf34452a10b88c40e5ab06870936f94.tar.gz
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.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/Parser/parsetok.c b/Parser/parsetok.c
index b68fbd701a..6017e5f7f8 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;