[Python-Dev] Sorry. No Release.

Fred L. Drake, Jr. fdrake@beopen.com
Tue, 4 Jul 2000 00:49:53 -0400 (EDT)


--nSaKzIhbgS
Content-Type: text/plain; charset=us-ascii
Content-Description: message body and .signature
Content-Transfer-Encoding: 7bit


Greg Stein writes:
 > Speaking out of my butt here, without looking at code, I would suspect that
 > the parser can return specializations "syntax error" to indicate that a
 > problem with indentation occurred.

  And I'm sure you'll find the way to do it.  ;)  Here's a patch that
sets up the IndentationError and TabError exceptions, and gets
TabError raised when -tt is in effect.  If you can figure out how to
get IndentationError raised for other indentation-related errors, I'll
be interested in seeing it.  Essentially, the parser-generator will
need to be able to distinguish between INDENT/DEDENT errors and other
errors, and I've not dug deep enough to figure that one out.  The
tab/space errors are easy since they're in the hand-coded lexer.


  -Fred

-- 
Fred L. Drake, Jr.  <fdrake at beopen.com>
BeOpen PythonLabs Team Member


--nSaKzIhbgS
Content-Type: text/plain
Content-Description: SyntaxError specialization
Content-Disposition: inline;
	filename="indentation-error.patch"
Content-Transfer-Encoding: 7bit

*** cvs-python/Include/pyerrors.h	Fri Jun 30 19:58:04 2000
--- python/Include/pyerrors.h	Mon Jul  3 19:35:06 2000
***************
*** 54,59 ****
--- 54,61 ----
  extern DL_IMPORT(PyObject *) PyExc_RuntimeError;
  extern DL_IMPORT(PyObject *) PyExc_NotImplementedError;
  extern DL_IMPORT(PyObject *) PyExc_SyntaxError;
+ extern DL_IMPORT(PyObject *) PyExc_IndentationError;
+ extern DL_IMPORT(PyObject *) PyExc_TabError;
  extern DL_IMPORT(PyObject *) PyExc_SystemError;
  extern DL_IMPORT(PyObject *) PyExc_SystemExit;
  extern DL_IMPORT(PyObject *) PyExc_TypeError;
*** cvs-python/Lib/test/test_exceptions.py	Tue Jun 20 14:52:57 2000
--- python/Lib/test/test_exceptions.py	Tue Jul  4 00:36:58 2000
***************
*** 86,91 ****
--- 86,99 ----
  try: exec '/\n'
  except SyntaxError: pass
  
+ r(IndentationError)
+ 
+ r(TabError)
+ # can only be tested under -tt, and is the only test for -tt
+ #try: compile("try:\n\t1/0\n    \t1/0\nfinally:\n pass\n", '<string>', 'exec')
+ #except TabError: pass
+ #else: raise TestFailed
+ 
  r(SystemError)
  print '(hard to reproduce)'
  
*** cvs-python/Lib/test/output/test_exceptions	Sun Jun 25 06:44:57 2000
--- python/Lib/test/output/test_exceptions	Tue Jul  4 00:43:31 2000
***************
*** 28,33 ****
--- 28,37 ----
  spam
  SyntaxError
  spam
+ IndentationError
+ spam
+ TabError
+ spam
  SystemError
  (hard to reproduce)
  spam
*** cvs-python/Python/exceptions.c	Sat Jul  1 00:45:52 2000
--- python/Python/exceptions.c	Mon Jul  3 19:34:25 2000
***************
*** 68,73 ****
--- 68,78 ----
        |\n\
        +-- AttributeError\n\
        +-- SyntaxError\n\
+       |    |\n\
+       |    +-- IndentationError\n\
+       |         |\n\
+       |         +-- TabError\n\
+       |\n\
        +-- TypeError\n\
        +-- AssertionError\n\
        +-- LookupError\n\
***************
*** 773,778 ****
--- 778,789 ----
  static char
  MemoryError__doc__[] = "Out of memory.";
  
+ static char
+ IndentationError__doc__[] = "Improper indentation.";
+ 
+ static char
+ TabError__doc__[] = "Improper mixture of spaces and tabs.";
+ 
  
  
  /* module global functions */
***************
*** 807,812 ****
--- 818,825 ----
  PyObject *PyExc_RuntimeError;
  PyObject *PyExc_NotImplementedError;
  PyObject *PyExc_SyntaxError;
+ PyObject *PyExc_IndentationError;
+ PyObject *PyExc_TabError;
  PyObject *PyExc_SystemError;
  PyObject *PyExc_SystemExit;
  PyObject *PyExc_UnboundLocalError;
***************
*** 868,873 ****
--- 881,890 ----
   {"AttributeError",     &PyExc_AttributeError, 0, AttributeError__doc__},
   {"SyntaxError",        &PyExc_SyntaxError,    0, SyntaxError__doc__,
    SyntaxError_methods, SyntaxError__classinit__},
+  {"IndentationError",   &PyExc_IndentationError, &PyExc_SyntaxError,
+   IndentationError__doc__},
+  {"TabError",   &PyExc_TabError, &PyExc_IndentationError,
+   TabError__doc__},
   {"AssertionError",     &PyExc_AssertionError, 0, AssertionError__doc__},
   {"LookupError",        &PyExc_LookupError,    0, LookupError__doc__},
   {"IndexError",         &PyExc_IndexError,     &PyExc_LookupError,
*** cvs-python/Python/pythonrun.c	Fri Jun 30 19:58:06 2000
--- python/Python/pythonrun.c	Mon Jul  3 20:01:33 2000
***************
*** 983,990 ****
  err_input(err)
  	perrdetail *err;
  {
! 	PyObject *v, *w;
  	char *msg = NULL;
  	v = Py_BuildValue("(ziiz)", err->filename,
  			    err->lineno, err->offset, err->text);
  	if (err->text != NULL) {
--- 983,991 ----
  err_input(err)
  	perrdetail *err;
  {
! 	PyObject *v, *w, *errtype;
  	char *msg = NULL;
+ 	errtype = PyExc_SyntaxError;
  	v = Py_BuildValue("(ziiz)", err->filename,
  			    err->lineno, err->offset, err->text);
  	if (err->text != NULL) {
***************
*** 1010,1015 ****
--- 1011,1017 ----
  		msg = "unexpected EOF while parsing";
  		break;
  	case E_INDENT:
+ 		errtype = PyExc_TabError;
  		msg = "inconsistent use of tabs and spaces in indentation";
  		break;
  	case E_OVERFLOW:
***************
*** 1022,1028 ****
  	}
  	w = Py_BuildValue("(sO)", msg, v);
  	Py_XDECREF(v);
! 	PyErr_SetObject(PyExc_SyntaxError, w);
  	Py_XDECREF(w);
  }
  
--- 1024,1030 ----
  	}
  	w = Py_BuildValue("(sO)", msg, v);
  	Py_XDECREF(v);
! 	PyErr_SetObject(errtype, w);
  	Py_XDECREF(w);
  }
  

--nSaKzIhbgS--