;; ;; Symbolic Regular Expressions ;; ;; For some sanity convert a symbolic regular expressions (sre) to ;; traditionl syntax. ;; ;; => that string in traditionl syntax ;; ' => that string literal ;; ?x => that character literal ;; (and r1 ... rn) => r1 ... rn ;; (or r1 ... rn) => r1 | ... | rn ;; (1+ r) => r+ ;; (1- r) => r? ;; (* r) => r* ;; (= r) => group capture ;; (defun sre (x) (concat "\\(?:" (cond ((stringp x) x) ((eql x 't) ".") ((eql x ?\]) (string x)) ((eql x ?^) "\\^") ((eql x ?-) (string x)) ((characterp x) (concat "[" (string x) "]")) ((ecase (car x) ((quote) (let ((r "")) (dotimes (i (length (cadr x)) r) (setq r (concat r (sre (aref (cadr x) i))))))) ((and) (let ((r "")) (dolist (k (cdr x) r) (setq r (concat r (sre k)))))) ((or) (let ((r nil)) (dolist (k (cdr x) r) (setq r (if r (concat r "|" (sre k)) (sre k)))))) ((*) (concat (sre `(and ,@(cdr x))) "*")) ((1+) (concat (sre `(and ,@(cdr x))) "+")) ((1-) (concat (sre `(and ,@(cdr x))) "?")) ((=) (concat "\\(" (sre `(and ,@(cdr x))) "\\)"))))) "\\)"))