Function: xsdre-compile-regexp

xsdre-compile-regexp is a byte-compiled function defined in xsd-regexp.el.gz.

Signature

(xsdre-compile-regexp RE ACCUM)

Documentation

Return an Emacs regular expression for the symbolic regexp RE.

Returns a list of strings whose head is the regexp for RE and whose tail is ACCUM.

Source Code

;; Defined in /usr/src/emacs/lisp/nxml/xsd-regexp.el.gz
(defun xsdre-compile-regexp (re accum)
  "Return an Emacs regular expression for the symbolic regexp RE.
Returns a list of strings whose head is the regexp for RE
and whose tail is ACCUM."
  (cond ((not (consp re))
	 (xsdre-compile-char-class re accum))
	((eq (car re) 'choice)
	 (setq accum (cons "\\(?:" accum))
	 (let ((choices (cdr re)))
	   (while choices
	     (setq accum
		   (xsdre-compile-regexp (car choices)
					 accum))
	     (setq choices (cdr choices))
	     (when choices
	       (setq accum
		     (cons "\\|" accum)))))
	 (cons "\\)" accum))
	((eq (car re) 'sequence)
	 (let ((members (cdr re)))
	   (while members
	     (setq accum (xsdre-compile-regexp (car members)
					       accum))
	     (setq members (cdr members))))
	 accum)
	((eq (car re) 'repeat)
	 (let* ((sub (nth 1 re))
		(lower (nth 2 re))
		(upper (nth 3 re))
		(need-paren (and (consp sub)
				 (eq (car sub) 'sequence))))
	   (when need-paren
	     (setq accum (cons "\\(?:" accum)))
	   (setq accum
		 (xsdre-compile-regexp sub accum))
	   (when need-paren
	     (setq accum (cons "\\)" accum)))
	   (cond ((not upper)
		  (cond ((eq lower 0)
			 (cons "*" accum))
			((eq lower 1)
			 (cons "+" accum))
			(t
			 (cons (concat "\\{"
				       (number-to-string lower)
				       ",\\}")
			       accum))))
		 ((eq lower upper)
		  (cons (concat "\\{"
				(number-to-string lower)
				"\\}")
			accum))
		 ((and (eq lower 0) (eq upper 1))
		  (cons "?" accum))
		 (t
		  (cons (concat "\\{"
				(number-to-string lower)
				","
				(number-to-string upper)
				"\\}")
			accum)))))
	(t (xsdre-compile-char-class re accum))))