[Python-checkins] CVS: python/dist/src/Parser parser.c,2.14,2.15 parser.h,2.12,2.13 parsetok.c,2.21,2.22 tokenizer.c,2.45,2.46

Fred L. Drake python-dev@python.org
2000年7月11日 10:53:03 -0700


Update of /cvsroot/python/python/dist/src/Parser
In directory slayer.i.sourceforge.net:/tmp/cvs-serv7915/Parser
Modified Files:
	parser.c parser.h parsetok.c tokenizer.c 
Log Message:
Create two new exceptions: IndentationError and TabError. These are
used for indentation related errors. This patch includes Ping's
improvements for indentation-related error messages.
Closes SourceForge patches #100734 and #100856.
Index: parser.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/parser.c,v
retrieving revision 2.14
retrieving revision 2.15
diff -C2 -r2.14 -r2.15
*** parser.c	2000年07月09日 03:09:56	2.14
--- parser.c	2000年07月11日 17:52:59	2.15
***************
*** 206,214 ****
 
 int
! PyParser_AddToken(ps, type, str, lineno)
 	register parser_state *ps;
 	register int type;
 	char *str;
 	int lineno;
 {
 	register int ilabel;
--- 206,215 ----
 
 int
! PyParser_AddToken(ps, type, str, lineno, expected_ret)
 	register parser_state *ps;
 	register int type;
 	char *str;
 	int lineno;
+ 	int *expected_ret;
 {
 	register int ilabel;
***************
*** 286,289 ****
--- 287,299 ----
 		/* Stuck, report syntax error */
 		D(printf(" Error.\n"));
+ 		if (expected_ret) {
+ 			if (s->s_lower == s->s_upper - 1) {
+ 				/* Only one possible expected token */
+ 				*expected_ret = ps->p_grammar->
+ 				 g_ll.ll_label[s->s_lower].lb_type;
+ 			}
+ 			else 
+ 		 	*expected_ret = -1;
+ 		}
 		return E_SYNTAX;
 	}
Index: parser.h
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/parser.h,v
retrieving revision 2.12
retrieving revision 2.13
diff -C2 -r2.12 -r2.13
*** parser.h	2000年07月09日 03:09:56	2.12
--- parser.h	2000年07月11日 17:52:59	2.13
***************
*** 39,43 ****
 parser_state *PyParser_New(grammar *g, int start);
 void PyParser_Delete(parser_state *ps);
! int PyParser_AddToken(parser_state *ps, int type, char *str, int lineno);
 void PyGrammar_AddAccelerators(grammar *g);
 
--- 39,44 ----
 parser_state *PyParser_New(grammar *g, int start);
 void PyParser_Delete(parser_state *ps);
! int PyParser_AddToken(parser_state *ps, int type, char *str, int lineno,
! int *expected_ret);
 void PyGrammar_AddAccelerators(grammar *g);
 
Index: parsetok.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/parsetok.c,v
retrieving revision 2.21
retrieving revision 2.22
diff -C2 -r2.21 -r2.22
*** parsetok.c	2000年07月09日 03:09:56	2.21
--- parsetok.c	2000年07月11日 17:52:59	2.22
***************
*** 140,145 ****
 		str[len] = '0円';
 		if ((err_ret->error =
! 		 PyParser_AddToken(ps, (int)type, str,
! 				 tok->lineno)) != E_OK) {
 			if (err_ret->error != E_DONE)
 				PyMem_DEL(str);
--- 140,145 ----
 		str[len] = '0円';
 		if ((err_ret->error =
! 		 PyParser_AddToken(ps, (int)type, str, tok->lineno,
! 				 &(err_ret->expected))) != E_OK) {
 			if (err_ret->error != E_DONE)
 				PyMem_DEL(str);
Index: tokenizer.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/tokenizer.c,v
retrieving revision 2.45
retrieving revision 2.46
diff -C2 -r2.45 -r2.46
*** tokenizer.c	2000年07月09日 03:09:56	2.45
--- tokenizer.c	2000年07月11日 17:52:59	2.46
***************
*** 413,423 ****
 {
 	if (tok->alterror) {
! 		tok->done = E_INDENT;
 		tok->cur = tok->inp;
 		return 1;
 	}
 	if (tok->altwarning) {
! 		PySys_WriteStderr("%s: inconsistent tab/space usage\n",
! 			tok->filename);
 		tok->altwarning = 0;
 	}
--- 413,423 ----
 {
 	if (tok->alterror) {
! 		tok->done = E_TABSPACE;
 		tok->cur = tok->inp;
 		return 1;
 	}
 	if (tok->altwarning) {
! 		PySys_WriteStderr("%s: inconsistent use of tabs and spaces "
! "in indentation\n", tok->filename);
 		tok->altwarning = 0;
 	}
***************
*** 485,491 ****
 				/* Indent -- always one */
 				if (tok->indent+1 >= MAXINDENT) {
! 					PySys_WriteStderr(
! 						"excessive indent\n");
! 					tok->done = E_TOKEN;
 					tok->cur = tok->inp;
 					return ERRORTOKEN;
--- 485,489 ----
 				/* Indent -- always one */
 				if (tok->indent+1 >= MAXINDENT) {
! 					tok->done = E_TOODEEP;
 					tok->cur = tok->inp;
 					return ERRORTOKEN;
***************
*** 507,513 ****
 				}
 				if (col != tok->indstack[tok->indent]) {
! 					PySys_WriteStderr(
! 						"inconsistent dedent\n");
! 					tok->done = E_TOKEN;
 					tok->cur = tok->inp;
 					return ERRORTOKEN;
--- 505,509 ----
 				}
 				if (col != tok->indstack[tok->indent]) {
! 					tok->done = E_DEDENT;
 					tok->cur = tok->inp;
 					return ERRORTOKEN;

AltStyle によって変換されたページ (->オリジナル) /