diff Parser/parser.c @ 12970:63436719d12e legacy-trunk

Add new parser error code, E_OVERFLOW. This error is returned when the number of children of a node exceeds the max possible value for the short that is used to count them. The Python runtime converts this parser error into the SyntaxError "expression too long."
author Jeremy Hylton <jeremy@alum.mit.edu>
date Tue, 20 Jun 2000 19:10:44 +0000
parents 1c9a84e0981d
children 916fb024ce94
line wrap: on
line diff
--- a/Parser/parser.c	Tue Jun 20 18:52:57 2000 +0000
+++ b/Parser/parser.c	Tue Jun 20 19:10:44 2000 +0000
@@ -153,11 +153,11 @@
 	int newstate;
 	int lineno;
 {
+	int err;
 	assert(!s_empty(s));
-	if (PyNode_AddChild(s->s_top->s_parent, type, str, lineno) == NULL) {
-		fprintf(stderr, "shift: no mem in addchild\n");
-		return -1;
-	}
+	err = PyNode_AddChild(s->s_top->s_parent, type, str, lineno);
+	if (err)
+		return err;
 	s->s_top->s_state = newstate;
 	return 0;
 }
@@ -172,13 +172,13 @@
 	int newstate;
 	int lineno;
 {
+	int err;
 	register node *n;
 	n = s->s_top->s_parent;
 	assert(!s_empty(s));
-	if (PyNode_AddChild(n, type, (char *)NULL, lineno) == NULL) {
-		fprintf(stderr, "push: no mem in addchild\n");
-		return -1;
-	}
+	err = PyNode_AddChild(n, type, (char *)NULL, lineno);
+	if (err)
+		return err;
 	s->s_top->s_state = newstate;
 	return s_push(s, d, CHILD(n, NCH(n)-1));
 }
@@ -233,6 +233,7 @@
 	int lineno;
 {
 	register int ilabel;
+	int err;
 	
 	D(printf("Token %s/'%s' ... ", _PyParser_TokenNames[type], str));
 	
@@ -260,20 +261,20 @@
 					int arrow = x & ((1<<7)-1);
 					dfa *d1 = PyGrammar_FindDFA(
 						ps->p_grammar, nt);
-					if (push(&ps->p_stack, nt, d1,
-						arrow, lineno) < 0) {
+					if ((err = push(&ps->p_stack, nt, d1,
+						arrow, lineno)) > 0) {
 						D(printf(" MemError: push\n"));
-						return E_NOMEM;
+						return err;
 					}
 					D(printf(" Push ...\n"));
 					continue;
 				}
 				
 				/* Shift the token */
-				if (shift(&ps->p_stack, type, str,
-						x, lineno) < 0) {
+				if ((err = shift(&ps->p_stack, type, str,
+						x, lineno)) > 0) {
 					D(printf(" MemError: shift.\n"));
-					return E_NOMEM;
+					return err;
 				}
 				D(printf(" Shift.\n"));
 				/* Pop while we are in an accept-only state */