]> git.eshelyaron.com Git - emacs.git/commitdiff
Add rx.el support for numbered groups (Bug#8776).
authorChong Yidong <cyd@stupidchicken.com>
Sat, 18 Jun 2011 21:12:33 +0000 (17:12 -0400)
committerChong Yidong <cyd@stupidchicken.com>
Sat, 18 Jun 2011 21:12:33 +0000 (17:12 -0400)
* lisp/emacs-lisp/rx.el (rx-constituents): Add support for numbered groups.
(rx-submatch-n): New function.
(rx): Document it.

etc/NEWS
lisp/ChangeLog
lisp/emacs-lisp/rx.el

index dad42e14f02a74dc47ae03d6819dff8533610c61..f8d6e590835ae29eab8305403a2f5b4b05848faf 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1051,6 +1051,9 @@ deferring warnings until the main command loop is executed.
 ** `set-auto-mode' now respects mode: local variables at the end of files,
 as well as those in the -*- line.
 
+---
+** rx.el has a new `group-n' construct for explicitly numbered groups.
+
 \f
 * Changes in Emacs 24.1 on non-free operating systems
 
index 1d66ebe8039cc259509753366aaf5ebaab30e9c5..e1a23e536493ece4119a89185165be8ad20e5526 100644 (file)
@@ -1,5 +1,10 @@
 2011-06-18  Chong Yidong  <cyd@stupidchicken.com>
 
+       * emacs-lisp/rx.el (rx-constituents): Add support for numbered
+       groups (Bug#8776).
+       (rx-submatch-n): New function.
+       (rx): Document it.
+
        * dired-x.el (dired-mark-unmarked-files): Fix interactive spec
        (Bug#8768).
 
index 7122de4789cc64b4b8dfbbc082d17a7361649d1e..56efd1421981c1e57e8cb8c14bcfffbdb854e25e 100644 (file)
     (**                        . (rx-** 2 nil))   ; SRE
     (submatch          . (rx-submatch 1 nil)) ; SRE
     (group             . submatch)     ; sregex
+    (submatch-n                . (rx-submatch-n 2 nil))
+    (group-n           . submatch-n)
     (zero-or-more      . (rx-kleene 1 nil))
     (one-or-more       . (rx-kleene 1 nil))
     (zero-or-one       . (rx-kleene 1 nil))
@@ -690,6 +692,16 @@ FORM is either `(repeat N FORM1)' or `(repeat N M FORMS...)'."
             (mapconcat (lambda (re) (rx-form re ':)) (cdr form) nil))
           "\\)"))
 
+(defun rx-submatch-n (form)
+  "Parse and produce code from FORM, which is `(submatch-n N ...)'."
+  (let ((n (nth 1 form)))
+    (concat "\\(?" (number-to-string n) ":"
+           (if (= 3 (length form))
+               ;; Only one sub-form.
+               (rx-form (nth 2 form))
+             ;; Several sub-forms implicitly concatenated.
+             (mapconcat (lambda (re) (rx-form re ':)) (cddr form) nil))
+           "\\)")))
 
 (defun rx-backref (form)
   "Parse and produce code from FORM, which is `(backref N)'."
@@ -1072,6 +1084,11 @@ CHAR
      like `and', but makes the match accessible with `match-end',
      `match-beginning', and `match-string'.
 
+`(submatch-n N SEXP1 SEXP2 ...)'
+`(group-n N SEXP1 SEXP2 ...)'
+     like `group', but make it an explicitly-numbered group with
+     group number N.
+
 `(or SEXP1 SEXP2 ...)'
 `(| SEXP1 SEXP2 ...)'
      matches anything that matches SEXP1 or SEXP2, etc.  If all