[Python-checkins] CVS: python/dist/src/Parser grammar.c,2.17,2.18 tokenizer.c,2.47,2.48

Thomas Wouters python-dev@python.org
Thu, 24 Aug 2000 13:11:37 -0700


Update of /cvsroot/python/python/dist/src/Parser
In directory slayer.i.sourceforge.net:/tmp/cvs-serv13530/Parser

Modified Files:
	grammar.c tokenizer.c 
Log Message:

Support for three-token characters (**=, >>=, <<=) which was written by
Michael Hudson, and support in general for the augmented assignment syntax.
The graminit.c patch is large!



Index: grammar.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/grammar.c,v
retrieving revision 2.17
retrieving revision 2.18
diff -C2 -r2.17 -r2.18
*** grammar.c	2000/07/22 19:20:54	2.17
--- grammar.c	2000/08/24 20:11:31	2.18
***************
*** 212,215 ****
--- 212,227 ----
  					lb->lb_str);
  		}
+ 		else if (lb->lb_str[2] && lb->lb_str[3] && lb->lb_str[4] == lb->lb_str[0]) {
+ 			int type = (int) PyToken_ThreeChars(lb->lb_str[1],
+ 							    lb->lb_str[2],
+ 							    lb->lb_str[3]);
+ 			if (type != OP) {
+ 				lb->lb_type = type;
+ 				lb->lb_str = NULL;
+ 			}
+ 			else
+ 				printf("Unknown OP label %s\n",
+ 					lb->lb_str);
+ 		}
  		else
  			printf("Can't translate STRING label %s\n",

Index: tokenizer.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/tokenizer.c,v
retrieving revision 2.47
retrieving revision 2.48
diff -C2 -r2.47 -r2.48
*** tokenizer.c	2000/07/22 19:20:54	2.47
--- tokenizer.c	2000/08/24 20:11:31	2.48
***************
*** 79,82 ****
--- 79,93 ----
  	"RIGHTSHIFT",
  	"DOUBLESTAR",
+ 	"PLUSEQUAL",
+ 	"MINEQUAL",
+ 	"STAREQUAL",
+ 	"SLASHEQUAL",
+ 	"PERCENTEQUAL",
+ 	"AMPEREQUAL",
+ 	"VBAREQUAL",
+ 	"CIRCUMFLEXEQUAL",
+ 	"LEFTSHIFTEQUAL",
+ 	"RIGHTSHIFTEQUAL",
+ 	"DOUBLESTAREQUAL",
  	/* This table must match the #defines in token.h! */
  	"OP",
***************
*** 389,401 ****
--- 400,488 ----
  		}
  		break;
+ 	case '+':
+ 		switch (c2) {
+ 		case '=':	return PLUSEQUAL;
+ 		}
+ 		break;
+ 	case '-':
+ 		switch (c2) {
+ 		case '=':	return MINEQUAL;
+ 		}
+ 		break;
  	case '*':
  		switch (c2) {
  		case '*':	return DOUBLESTAR;
+ 		case '=':	return STAREQUAL;
  		}
  		break;
+ 	case '/':
+ 		switch (c2) {
+ 		case '=':	return SLASHEQUAL;
+ 		}
+ 		break;
+ 	case '|':
+ 		switch (c2) {
+ 		case '=':	return VBAREQUAL;
+ 		}
+ 		break;
+ 	case '%':
+ 		switch (c2) {
+ 		case '=':	return PERCENTEQUAL;
+ 		}
+ 		break;
+ 	case '&':
+ 		switch (c2) {
+ 		case '=':	return AMPEREQUAL;
+ 		}
+ 		break;
+ 	case '^':
+ 		switch (c2) {
+ 		case '=':	return CIRCUMFLEXEQUAL;
+ 		}
+ 		break;
  	}
  	return OP;
  }
  
+ int
+ PyToken_ThreeChars(int c1, int c2, int c3)
+ {
+ 	switch (c1) {
+ 	case '<':
+ 		switch (c2) {
+ 		case '<':
+ 			switch (c3) {
+ 			case '=':
+ 				return LEFTSHIFTEQUAL;
+ 				break;
+ 			}
+ 			break;
+ 		}
+ 		break;
+ 	case '>':
+ 		switch (c2) {
+ 		case '>':
+ 			switch (c3) {
+ 			case '=':
+ 				return RIGHTSHIFTEQUAL;
+ 				break;
+ 			}
+ 			break;
+ 		}
+ 		break;
+ 	case '*':
+ 		switch (c2) {
+ 		case '*':
+ 			switch (c3) {
+ 			case '=':
+ 				return DOUBLESTAREQUAL;
+ 				break;
+ 			}
+ 			break;
+ 		}
+ 		break;
+ 	}
+ 	return OP;
+ }
  
  static int
***************
*** 771,774 ****
--- 858,868 ----
  		int token = PyToken_TwoChars(c, c2);
  		if (token != OP) {
+ 			int c3 = tok_nextc(tok);
+ 			int token3 = PyToken_ThreeChars(c, c2, c3);
+ 			if (token3 != OP) {
+ 				token = token3;
+ 			} else {
+ 				tok_backup(tok, c3);
+ 			}
  			*p_start = tok->start;
  			*p_end = tok->cur;