[Python-checkins] CVS: python/dist/src/Parser parser.c,2.18,2.18.8.1 parser.h,2.14,2.14.8.1 parsetok.c,2.25,2.25.8.1

Tim Peters tim_one@users.sourceforge.net
Mon, 16 Jul 2001 14:41:09 -0700


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

Modified Files:
      Tag: descr-branch
	parser.c parser.h parsetok.c 
Log Message:
Resuming interrupted merge checkin.


Index: parser.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/parser.c,v
retrieving revision 2.18
retrieving revision 2.18.8.1
diff -C2 -r2.18 -r2.18.8.1
*** parser.c	2000/10/02 10:21:59	2.18
--- parser.c	2001/07/16 21:41:07	2.18.8.1
***************
*** 80,83 ****
--- 80,84 ----
  		return NULL;
  	ps->p_grammar = g;
+ 	ps->p_generators = 0;
  	ps->p_tree = PyNode_New(start);
  	if (ps->p_tree == NULL) {
***************
*** 132,137 ****
  
  static int
! classify(grammar *g, int type, char *str)
  {
  	register int n = g->g_ll.ll_nlabels;
  	
--- 133,139 ----
  
  static int
! classify(parser_state *ps, int type, char *str)
  {
+ 	grammar *g = ps->p_grammar;
  	register int n = g->g_ll.ll_nlabels;
  	
***************
*** 144,147 ****
--- 146,153 ----
  					l->lb_str[0] == s[0] &&
  					strcmp(l->lb_str, s) == 0) {
+ 				if (!ps->p_generators &&
+ 				    s[0] == 'y' &&
+ 				    strcmp(s, "yield") == 0)
+ 					break; /* not a keyword */
  				D(printf("It's a keyword\n"));
  				return n - i;
***************
*** 165,168 ****
--- 171,190 ----
  }
  
+ static void
+ future_hack(parser_state *ps)
+ {
+ 	node *n = ps->p_stack.s_top->s_parent;
+ 	node *ch;
+ 
+ 	if (strcmp(STR(CHILD(n, 0)), "from") != 0)
+ 		return;
+ 	ch = CHILD(n, 1);
+ 	if (strcmp(STR(CHILD(ch, 0)), "__future__") != 0)
+ 		return;
+ 	ch = CHILD(n, 3);
+ 	if (NCH(ch) == 1 && strcmp(STR(CHILD(ch, 0)), "generators") == 0)
+ 		ps->p_generators = 1;
+ }
+ 
  int
  PyParser_AddToken(register parser_state *ps, register int type, char *str,
***************
*** 175,179 ****
  	
  	/* Find out which label this token is */
! 	ilabel = classify(ps->p_grammar, type, str);
  	if (ilabel < 0)
  		return E_SYNTAX;
--- 197,201 ----
  	
  	/* Find out which label this token is */
! 	ilabel = classify(ps, type, str);
  	if (ilabel < 0)
  		return E_SYNTAX;
***************
*** 218,222 ****
  						[ps->p_stack.s_top->s_state],
  					s->s_accept && s->s_narcs == 1) {
! 					D(printf("  Direct pop.\n"));
  					s_pop(&ps->p_stack);
  					if (s_empty(&ps->p_stack)) {
--- 240,251 ----
  						[ps->p_stack.s_top->s_state],
  					s->s_accept && s->s_narcs == 1) {
! 					D(printf("  DFA '%s', state %d: "
! 						 "Direct pop.\n",
! 						 d->d_name,
! 						 ps->p_stack.s_top->s_state));
! 					if (d->d_name[0] == 'i' &&
! 					    strcmp(d->d_name,
! 						   "import_stmt") == 0)
! 						future_hack(ps);
  					s_pop(&ps->p_stack);
  					if (s_empty(&ps->p_stack)) {
***************
*** 231,234 ****
--- 260,266 ----
  		
  		if (s->s_accept) {
+ 			if (d->d_name[0] == 'i' &&
+ 			    strcmp(d->d_name, "import_stmt") == 0)
+ 				future_hack(ps);
  			/* Pop this dfa and try again */
  			s_pop(&ps->p_stack);

Index: parser.h
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/parser.h,v
retrieving revision 2.14
retrieving revision 2.14.8.1
diff -C2 -r2.14 -r2.14.8.1
*** parser.h	2000/09/01 23:29:28	2.14
--- parser.h	2001/07/16 21:41:07	2.14.8.1
***************
*** 26,29 ****
--- 26,30 ----
  	grammar		*p_grammar;	/* Grammar to use */
  	node		*p_tree;	/* Top of parse tree */
+ 	int		p_generators;	/* 1 if yield is a keyword */
  } parser_state;
  

Index: parsetok.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/parsetok.c,v
retrieving revision 2.25
retrieving revision 2.25.8.1
diff -C2 -r2.25 -r2.25.8.1
*** parsetok.c	2000/09/01 23:29:28	2.25
--- parsetok.c	2001/07/16 21:41:07	2.25.8.1
***************
*** 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 (;;) {