From 67b8025ea15e5df03671bef9ebe48c00e121983a Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Tue, 26 Sep 2017 22:47:12 +0200 Subject: big commit --- modules/language/python/module/re.scm | 225 ++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 modules/language/python/module/re.scm (limited to 'modules/language/python/module') diff --git a/modules/language/python/module/re.scm b/modules/language/python/module/re.scm new file mode 100644 index 0000000..0efbec9 --- /dev/null +++ b/modules/language/python/module/re.scm @@ -0,0 +1,225 @@ +(define-module (language python modules re) + #:export()) + + +(define-sytax-rule (mk n tag str) (define n (f-seq tag (f-tag str)))) +(mk f-. #:. ".") +(mk f-^ #:^ "^") +(mk f-$ #:$ "$") + +(define subexpr (f-list #:sub + (f-seq (f-tag "(") f-start ee f-end (f-tag ")")))) + +(define f-back + (f-or (f-list #:class (mk-token (f-reg! "[AZbBdDsSwS]"))) + (mk-token (f-reg ".")))) + +(define (ch not) + (f-list #:ch + (f-or! (f-seq (f-char #\\) f-back) + (mk-token (f-not! not))))) + +(define bbody (f-cons (ch "[\\]") (ff* (ch "[]\\]")))) + +(define choice + (f-cons #:bracket + (f-or! + (f-seq "[^]" (f-out (list #:ch "^"))) + (f-cons* + (f-tag "[") + (f? (f-seq (f-tag "^") (f-out #t))) + bbody)))) + +(define-syntax-rule (mk-post q* str tag) + (define q* + ( (c) + (.. c2 ((f-tag str) c)) + ( (cons (list tag (car c)) (cdr c)))))) + +(mk-post q* "*" #:*) +(mk-post q? "?" #:?) +(mk-post q+ "+" #:+) +(mk-post q* "*?" #:*?) +(mk-post q? "??" #:??) +(mk-post q+ "+?" #:+?) + +(define q-or + ( (c) + (.. (c2) ((f-seq (f-tag "|") e) '())) + ( (list #:or c c2)))) + +(define q? + ( (c) + (.. c2 ((f-tag "*") c)) + ( (cons (list #:* (car c)) (cdr c))))) + +(define group + (lambda (f) + ( (c1) + (.. c2 (f '())) + (with ((L (cons (cons I c2) L)) + (I (+ i 1))) + ( (list #:list (#:append c1 c2))))))) + +(define group-name + (lambda (f name) + ( (c1) + (.. c2 (f '())) + (with ((L (cons* (cons name c2) (cons I c2) L)) + (I (+ i 1))) + ( (list #:list (#:append c1 c2))))))) + +(define (incant name) + ( (c) + (let ((r (assoc name L))) + (if r + ( (.. (f-tag (cdr r)))) + ( (error "group is not existing in the history")))))) + +(define (incant-rev name) + ( (c) + (let ((r (assoc name L))) + (if r + ( (.. (f-tag (reverse (cdr r))))) + ( (error "group is not existing in the history")))))) + +(define (reverse-form x) + (match x + ((#:or x y) + (list #:or (reverse-form x) (reverse-form y))) + ((#:group f) + (list #:group (reverse-form f))) + ((#:?P< f n) + (list #:?P< (reverse-form f) n)) + ((#:?: f) + (reverse-form f)) + ((#:?P= name) + (#:?P=-rev name)) + ((#:?P=-rev name) + (#:?P= name)) + ((#:?if name yes no) + (list #:?if-rev name (reverse-form yes) (reverse-form no))) + ((#:?if-rev name yes no) + (list #:?if name (reverse-form yes) (reverse-form no))) + ((#:?= f ) (list #:?= (reverse-form f))) + ((#:?! f ) (list #:?! (reverse-form f))) + ((#:?<= f ) (list #:?<= f)) + ((#:?