diff -r a729dfdbd24b Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst Thu Mar 24 22:32:56 2011 +0200 +++ b/Doc/library/exceptions.rst Fri Mar 25 01:43:13 2011 +0100 @@ -289,6 +289,12 @@ This is a subclass of :exc:`IndentationError`. +.. exception:: ParserError + + Raised when the parser encounters an error due to internal limitations. + This is a subclass of :exc:`SyntaxError`. + + .. exception:: SystemError Raised when the interpreter finds an internal error, but the situation does not diff -r a729dfdbd24b Include/errcode.h --- a/Include/errcode.h Thu Mar 24 22:32:56 2011 +0200 +++ b/Include/errcode.h Fri Mar 25 01:43:13 2011 +0100 @@ -30,6 +30,7 @@ #define E_EOLS 24 /* EOL in single-quoted string */ #define E_LINECONT 25 /* Unexpected characters after a line continuation */ #define E_IDENTIFIER 26 /* Invalid characters in identifier */ +#define E_TOONESTED 27 /* Too many opening parens */ #ifdef __cplusplus } diff -r a729dfdbd24b Include/pyerrors.h --- a/Include/pyerrors.h Thu Mar 24 22:32:56 2011 +0200 +++ b/Include/pyerrors.h Fri Mar 25 01:43:13 2011 +0100 @@ -149,6 +149,7 @@ PyAPI_DATA(PyObject *) PyExc_SyntaxError; PyAPI_DATA(PyObject *) PyExc_IndentationError; PyAPI_DATA(PyObject *) PyExc_TabError; +PyAPI_DATA(PyObject *) PyExc_ParserError; PyAPI_DATA(PyObject *) PyExc_ReferenceError; PyAPI_DATA(PyObject *) PyExc_SystemError; PyAPI_DATA(PyObject *) PyExc_SystemExit; diff -r a729dfdbd24b Lib/test/exception_hierarchy.txt --- a/Lib/test/exception_hierarchy.txt Thu Mar 24 22:32:56 2011 +0200 +++ b/Lib/test/exception_hierarchy.txt Fri Mar 25 01:43:13 2011 +0100 @@ -29,7 +29,8 @@ | +-- NotImplementedError +-- SyntaxError | +-- IndentationError - | +-- TabError + | | +-- TabError + | +-- ParserError +-- SystemError +-- TypeError +-- ValueError diff -r a729dfdbd24b Lib/test/test_parser.py --- a/Lib/test/test_parser.py Thu Mar 24 22:32:56 2011 +0200 +++ b/Lib/test/test_parser.py Fri Mar 25 01:43:13 2011 +0100 @@ -542,10 +542,7 @@ def test_trigger_memory_error(self): e = self._nested_expression(100) - print("Expecting 's_push: parser stack overflow' in next line", - file=sys.stderr) - sys.stderr.flush() - self.assertRaises(MemoryError, parser.expr, e) + self.assertRaises(ParserError, parser.expr, e) class STObjectTestCase(unittest.TestCase): """Test operations on ST objects themselves""" diff -r a729dfdbd24b Objects/exceptions.c --- a/Objects/exceptions.c Thu Mar 24 22:32:56 2011 +0200 +++ b/Objects/exceptions.c Fri Mar 25 01:43:13 2011 +0100 @@ -1063,6 +1063,14 @@ /* + * ParserError extends SyntaxError + */ +MiddlingExtendsException(PyExc_SyntaxError, ParserError, SyntaxError, + "Raised when the parser encounters an error due " + "to internal limitations."); + + +/* * LookupError extends Exception */ SimpleExtendsException(PyExc_Exception, LookupError, @@ -1998,6 +2006,7 @@ PRE_INIT(SyntaxError) PRE_INIT(IndentationError) PRE_INIT(TabError) + PRE_INIT(ParserError) PRE_INIT(LookupError) PRE_INIT(IndexError) PRE_INIT(KeyError) @@ -2061,6 +2070,7 @@ POST_INIT(SyntaxError) POST_INIT(IndentationError) POST_INIT(TabError) + POST_INIT(ParserError) POST_INIT(LookupError) POST_INIT(IndexError) POST_INIT(KeyError) diff -r a729dfdbd24b Parser/parser.c --- a/Parser/parser.c Thu Mar 24 22:32:56 2011 +0200 +++ b/Parser/parser.c Fri Mar 25 01:43:13 2011 +0100 @@ -39,8 +39,7 @@ { register stackentry *top; if (s->s_top == s->s_base) { - fprintf(stderr, "s_push: parser stack overflow\n"); - return E_NOMEM; + return E_TOONESTED; } top = --s->s_top; top->s_dfa = d; diff -r a729dfdbd24b Python/pythonrun.c --- a/Python/pythonrun.c Thu Mar 24 22:32:56 2011 +0200 +++ b/Python/pythonrun.c Fri Mar 25 01:43:13 2011 +0100 @@ -2052,6 +2052,10 @@ case E_IDENTIFIER: msg = "invalid character in identifier"; break; + case E_TOONESTED: + errtype = PyExc_ParserError; + msg = "too many opening parens"; + break; default: fprintf(stderr, "error=%d\n", err->error); msg = "unknown parsing error";