all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: help-gnu-emacs@gnu.org
Subject: Re: Stack overflow in regexp matcher
Date: Mon, 07 Feb 2011 15:24:14 -0500	[thread overview]
Message-ID: <jwvipwvtxcr.fsf-monnier+gnu.emacs.help@gnu.org> (raw)
In-Reply-To: mailman.0.1296989279.10345.help-gnu-emacs@gnu.org

> The following fails with "Stack overflow in regexp matcher" in emacs 23
> and 24:

> (string-match
>  "^\\[.+\\]$"
>  (concat
>   "["
>   (mapconcat (lambda (i) "x") (number-sequence 1 33500) "")
>   "]"))

> This surprised me; I assumed that the ^ and $ anchors, and the simple
> ".+" requirement in the middle would result in a simple, efficient
> regexp.

The problem is that Emacs's regexp engine is not very clever.

Basically, each time . succeeds we first recurse, trying to match the
rest against ".*\\]$", and if that fails then we try to match
"\\]$" instead.  The fact that at each step we have this "fork" of two
different possible ways to match, means that at each step we have to
push something on the stack, so the longer the string against which we
match, the deeper the stack we need.

You can fix it by using a regexp that does not need this backtracking.
E.g. "^\\[[^]\n]+\\]$".  If you do that, then Emacs's regexp engine will
notice that when [^]\n] matches, then "\\]$" can't match, so there's no
point pushing something on the stack to try the second path when the
first fails.  I.e. it will do the whole match with a constant amount of
stack space.

This relates also to the recent discussion with Ilya in the thread
titled "will we ever have zero width assertions in regexps?".


        Stefan


       reply	other threads:[~2011-02-07 20:24 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <mailman.0.1296989279.10345.help-gnu-emacs@gnu.org>
2011-02-07 20:24 ` Stefan Monnier [this message]
2011-02-08 22:58   ` Stack overflow in regexp matcher Dan Davison
2014-10-24  6:41 Alan Schmitt
2014-10-24 19:02 ` Charles Berry
2014-10-24 19:51   ` Gregor Zattler
2014-10-25 17:00     ` Charles C. Berry
2014-10-25 18:34       ` Charles C. Berry
2014-11-28 18:33         ` Alan Schmitt
2014-10-26 11:11       ` Alan Schmitt
2014-10-25  9:24   ` Alan Schmitt
  -- strict thread matches above, loose matches on Subject: below --
2011-02-06 10:47 Dan Davison
2011-02-06 13:31 ` Stephen Berman
2011-02-06 14:01   ` guivho
2011-02-06 14:17   ` Eli Zaretskii
2011-02-06 14:30     ` Dan Davison
2011-02-06 16:02     ` Stephen Berman
2010-11-20 16:03 Michael Brand
2010-11-28 20:08 ` Matt Lundin
2009-12-16 17:15 akaiser
2009-12-17 17:01 ` Barry Margolin
2009-12-17 22:10   ` Ilya Zakharevich
2009-12-17 22:13   ` akaiser
2003-10-16 16:35 Sam Steingold
2003-10-16 18:56 ` Stefan Monnier
2003-10-17  6:13   ` Stephen J. Turnbull
2003-10-17 13:55     ` Stefan Monnier
2003-10-17 14:24       ` Andreas Schwab

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jwvipwvtxcr.fsf-monnier+gnu.emacs.help@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.