(py-parse-state): make sure we don't land inside a triple-quoted
string
diff --git a/Misc/python-mode.el b/Misc/python-mode.el
index 7f59c31..b40a587 100644
--- a/Misc/python-mode.el
+++ b/Misc/python-mode.el
@@ -1752,16 +1752,22 @@
 ;; returns the parse state at point (see parse-partial-sexp docs)
 (defun py-parse-state ()
   (save-excursion
-    (let ((here (point)) )
-      ;; back up to the first preceding line (if any; else start of
-      ;; buffer) that begins with a popular Python keyword, or a non-
-      ;; whitespace and non-comment character.  These are good places
-      ;; to start parsing to see whether where we started is at a
-      ;; non-zero nesting level.  It may be slow for people who write
-      ;; huge code blocks or huge lists ... tough beans.
-      (re-search-backward py-parse-state-re nil 'move)
-      (beginning-of-line)
-      (parse-partial-sexp (point) here))))
+    (let ((here (point))
+	  pps done)
+      (while (not done)
+	;; back up to the first preceding line (if any; else start of
+	;; buffer) that begins with a popular Python keyword, or a
+	;; non- whitespace and non-comment character.  These are good
+	;; places to start parsing to see whether where we started is
+	;; at a non-zero nesting level.  It may be slow for people who
+	;; write huge code blocks or huge lists ... tough beans.
+	(re-search-backward py-parse-state-re nil 'move)
+	(beginning-of-line)
+	(save-excursion
+	  (setq pps (parse-partial-sexp (point) here)))
+	;; make sure we don't land inside a triple-quoted string
+	(setq done (or (not (nth 3 pps)) (bobp))))
+      pps)))
 
 ;; if point is at a non-zero nesting level, returns the number of the
 ;; character that opens the smallest enclosing unclosed list; else