[Python-checkins] CVS: python/dist/src/Parser parsetok.c,2.25,2.26

Tim Peters tim_one@users.sourceforge.net
Sun, 15 Jul 2001 22:37:26 -0700


Update of /cvsroot/python/python/dist/src/Parser
In directory usw-pr-cvs1:/tmp/cvs-serv22251/python/dist/src/Parser

Modified Files:
	parsetok.c 
Log Message:
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())


Index: parsetok.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/parsetok.c,v
retrieving revision 2.25
retrieving revision 2.26
diff -C2 -r2.25 -r2.26
*** parsetok.c	2000/09/01 23:29:28	2.25
--- parsetok.c	2001/07/16 05:37:24	2.26
***************
*** 14,24 ****
  
  /* Forward */
! static node *parsetok(struct tok_state *, grammar *, int, perrdetail *);
  
  /* Parse input coming from a string.  Return error code, print some errors. */
- 
  node *
  PyParser_ParseString(char *s, grammar *g, int start, perrdetail *err_ret)
  {
  	struct tok_state *tok;
  
--- 14,30 ----
  
  /* Forward */
! 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;
  
***************
*** 43,47 ****
  	}
  
! 	return parsetok(tok, g, start, err_ret);
  }
  
--- 49,53 ----
  	}
  
! 	return parsetok(tok, g, start, err_ret, flags);
  }
  
***************
*** 53,56 ****
--- 59,70 ----
  		   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;
  
***************
*** 73,77 ****
  
  
! 	return parsetok(tok, g, start, err_ret);
  }
  
--- 87,91 ----
  
  
! 	return parsetok(tok, g, start, err_ret, flags);
  }
  
***************
*** 80,84 ****
  
  static node *
! parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret)
  {
  	parser_state *ps;
--- 94,99 ----
  
  static node *
! parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
! 	 int flags)
  {
  	parser_state *ps;
***************
*** 91,94 ****
--- 106,111 ----
  		return NULL;
  	}
+ 	if (flags & PyPARSE_YIELD_IS_KEYWORD)
+ 		ps->p_generators = 1;
  
  	for (;;) {