aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorMattias EngdegÄrd2019-05-15 22:44:00 +0200
committerMattias EngdegÄrd2019-05-20 11:39:46 +0200
commitb552fc05c231ca6800330a318d3a74ddd0f5a13c (patch)
tree5e030d1bcd878517891180a58d8ba2cec62c1899 /lisp
parente9f9827eb01a382bead6c180f6703322167e6f89 (diff)
downloademacs-b552fc05c231ca6800330a318d3a74ddd0f5a13c.tar.gz
emacs-b552fc05c231ca6800330a318d3a74ddd0f5a13c.zip
Allow zero-argument rx `or' and `seq' forms
Make the rx `or' and `seq' forms accept zero arguments to produce a never-matching regexp and an empty string, respectively. * lisp/emacs-lisp/rx.el (rx-constituents, rx-or): Permit zero args. (rx): Amend doc string for `or' and `seq'. * test/lisp/emacs-lisp/rx-tests.el (rx-or, rx-seq): Test the change. * etc/NEWS (Changes in Specialized Modes and Packages): Mention the change.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/emacs-lisp/rx.el13
1 files changed, 8 insertions, 5 deletions
diff --git a/lisp/emacs-lisp/rx.el b/lisp/emacs-lisp/rx.el
index 9d9028d87d5..9478bd3bbdb 100644
--- a/lisp/emacs-lisp/rx.el
+++ b/lisp/emacs-lisp/rx.el
@@ -110,11 +110,11 @@
110;; FIXME: support macros. 110;; FIXME: support macros.
111 111
112(defvar rx-constituents ;Not `const' because some modes extend it. 112(defvar rx-constituents ;Not `const' because some modes extend it.
113 '((and . (rx-and 1 nil)) 113 '((and . (rx-and 0 nil))
114 (seq . and) ; SRE 114 (seq . and) ; SRE
115 (: . and) ; SRE 115 (: . and) ; SRE
116 (sequence . and) ; sregex 116 (sequence . and) ; sregex
117 (or . (rx-or 1 nil)) 117 (or . (rx-or 0 nil))
118 (| . or) ; SRE 118 (| . or) ; SRE
119 (not-newline . ".") 119 (not-newline . ".")
120 (nonl . not-newline) ; SRE 120 (nonl . not-newline) ; SRE
@@ -390,9 +390,11 @@ FORM is of the form `(and FORM1 ...)'."
390 "Parse and produce code from FORM, which is `(or FORM1 ...)'." 390 "Parse and produce code from FORM, which is `(or FORM1 ...)'."
391 (rx-check form) 391 (rx-check form)
392 (rx-group-if 392 (rx-group-if
393 (if (memq nil (mapcar 'stringp (cdr form))) 393 (cond
394 (mapconcat (lambda (x) (rx-form x '|)) (cdr form) "\\|") 394 ((null (cdr form)) regexp-unmatchable)
395 ((cl-every #'stringp (cdr form))
395 (regexp-opt (cdr form) nil t)) 396 (regexp-opt (cdr form) nil t))
397 (t (mapconcat (lambda (x) (rx-form x '|)) (cdr form) "\\|")))
396 (and (memq rx-parent '(: * t)) rx-parent))) 398 (and (memq rx-parent '(: * t)) rx-parent)))
397 399
398 400
@@ -1121,6 +1123,7 @@ CHAR
1121`(seq SEXP1 SEXP2 ...)' 1123`(seq SEXP1 SEXP2 ...)'
1122`(sequence SEXP1 SEXP2 ...)' 1124`(sequence SEXP1 SEXP2 ...)'
1123 matches what SEXP1 matches, followed by what SEXP2 matches, etc. 1125 matches what SEXP1 matches, followed by what SEXP2 matches, etc.
1126 Without arguments, matches the empty string.
1124 1127
1125`(submatch SEXP1 SEXP2 ...)' 1128`(submatch SEXP1 SEXP2 ...)'
1126`(group SEXP1 SEXP2 ...)' 1129`(group SEXP1 SEXP2 ...)'
@@ -1136,7 +1139,7 @@ CHAR
1136`(| SEXP1 SEXP2 ...)' 1139`(| SEXP1 SEXP2 ...)'
1137 matches anything that matches SEXP1 or SEXP2, etc. If all 1140 matches anything that matches SEXP1 or SEXP2, etc. If all
1138 args are strings, use `regexp-opt' to optimize the resulting 1141 args are strings, use `regexp-opt' to optimize the resulting
1139 regular expression. 1142 regular expression. Without arguments, never matches anything.
1140 1143
1141`(minimal-match SEXP)' 1144`(minimal-match SEXP)'
1142 produce a non-greedy regexp for SEXP. Normally, regexps matching 1145 produce a non-greedy regexp for SEXP. Normally, regexps matching