From bf35763d00bed87133880d9435d0014fd98ab7e5 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Fri, 13 Jul 2018 15:19:03 +0200 Subject: missing files --- modules/language/python/module/re/compile.scm | 257 ++++++++++++++++++++++++++ modules/language/python/module/re/flags.scm | 25 +++ modules/language/python/module/re/parser.scm | 63 +++++++ 3 files changed, 345 insertions(+) create mode 100644 modules/language/python/module/re/compile.scm create mode 100644 modules/language/python/module/re/flags.scm create mode 100644 modules/language/python/module/re/parser.scm (limited to 'modules/language/python/module/re') diff --git a/modules/language/python/module/re/compile.scm b/modules/language/python/module/re/compile.scm new file mode 100644 index 0000000..6ed7162 --- /dev/null +++ b/modules/language/python/module/re/compile.scm @@ -0,0 +1,257 @@ +(define-module (language python module re compile) + #:use-module (language python module re parser) + #:use-module (language python list) + #:use-module (language python string) + #:use-module ((parser stis-parser) #:select + ((parse . stisparse) .. f-nl! f-nl + f-tag! f-tag f-seq f-or f-or! f-and f-true g* g+ gmn ng* ng+ ngmn + g? ng? f-test! f-eof f-not! f-prev f-not f-out f-rev *whitespace* + f-nm f-pos)) + + #:use-module (parser stis-parser macros) + #:use-module (ice-9 match) + #:export (compile-reg test-reg parse)) + +(define-syntax-rule ( (a b) . code) + ( (d) + (let ((a (car d)) + (b (cadr d))) + . code))) + +(define wrap list) + +(define (fw f) + ( (L c) + (.. c2 (f c)) + ( (wrap L c2)))) + +(define-syntax-rule (group f) + (let () + (define-syntax-rule (mac s) (lambda (x n m) (set! s x))) + (let ((I (new-group)) + (ff f)) + ( (L c) + (let ((e -1) + (s -1)) + (.. c2 ((f-seq (f-pos (mac s)) ff (f-pos (mac e)))(list L c))) + (let* ((L (car c2)) + (L (cons (cons I (list (strit c (cadr c2)) s e)) L))) + ( (wrap L (cadr c2))))))))) + +(define-syntax-rule (group-name f name) + (let () + (define-syntax-rule (mac s) (lambda (x n m) (set! s x))) + (let* ((n (new-name name)) + (ff f)) + ( (L c) + (let ((e -1) + (s -1)) + (.. c2 ((f-seq (f-pos (mac s)) ff (f-pos (mac e))) (list L c))) + (let* ((L (car c2)) + (c2 (cadr c2)) + (L (cons (cons n (list (strit c c2) s e)) L))) + ( (wrap L c2)))))))) + +(define (strit u v) + (let lp ((v v) (r '())) + (if (eq? u v) + (list->string r) + (lp (cdr v) (cons (car v) r))))) + +(define (incant name) + ( (c) + (let* ((L (cadr c)) + (r (if (number? name) + (let lp ((l L)) + (define (f x u l) + (if (= x name) + u + (lp l))) + + (match l + (((x . u) . l) + (if (pair? x) + (f (cdr x) (car u) l) + (f x (car u) l))) + (() (error (+ "could not incant " name))))) + (let lp ((l L)) + (define (f x u l) + (if (equal? x name) + u + (lp l))) + + (match l + (((x . u) . l) + (if (pair? x) + (f (car x) u l) + (f x u l))) + (() (error (+ "could not incant " name)))))))) + + + + (if r + ( (.. ((fw (f-tag! r)) c))) + ( (error "group is not existing in the history")))))) + +(define (incant-rev name) + ( (c) + (let* ((L (cadr c)) + (r (assoc name L))) + (if r + ( (.. ((f-tag (reverse (cdr r))) c))) + ( (error "group is not existing in the history")))))) + +(define (reverse-form x) + (match x + ((#:or x) + (reverse-form x)) + ((#:or . l) + (cons #:or (map reverse-form l))) + ((#:sub 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)) + ((#:? ]")))) ">" (Ds ee) ")")) +(define (ch not) + (f-list #:ch + (f-or! (f-seq (f-char #\\) f-back) + (mk-token (f-not! not))))) +(define number (mk-token (f+ (f-reg! "[0-9]")) string->number)) +(define incant (f-list #:?P= "(?P=" (f-or! number + (mk-token (f+ (f-not! (f-reg "[) ]"))))) ")")) +(define coment (f-seq "(?#" (f* (f-not (f-tag ")"))) ")")) +(define repn? (f-list #:rep? "{" number "}" "?")) +(define repnm? (f-list #:rep? "{" number "," number "}" "?")) +(define repn (f-list #:rep "{" number "}")) +(define repnm (f-list #:rep "{" number "," number "}")) + +(define lookh (f-list #:?= "(?=" (Ds ee) ")")) +(define lookh! (f-list #:?! "(?!" (Ds ee) ")")) +(define bbody (f-cons (ch (f-reg "[\\]")) (ff* (ch (f-reg "[]\\]"))))) + +(define (f-if a b c) (f-or! (f-seq a b) c)) +(define choice + (f-cons #:bracket + (f-or! + (f-seq "[^]" (f-out (list (list #:ch (f-out #f) "^")))) + (f-cons* + (f-tag "[") + (f-if (f-tag "^") (f-out #t) (f-out #f)) + bbody)))) + + +(define f-bar (f-tag "|")) +(define qq (ch (f-reg "[][?+|*.$^() \\]"))) +(define atom (f-or qq f-. choice subexpr anongroup namegroup incant coment lookh lookh! f-^ f-$)) +(define spec (f-list #:op atom (f-or! q+? q?? q*? q* q? q+ repn? repnm? repn repnm))) +(define aatom (f-or! spec atom)) +(define line (f-cons* #:seq aatom (ff* aatom ))) +(define ee (f-cons* #:or line (ff* (f-seq f-bar line)))) + +(define (parse-reg str) (parse str ee)) + +(define e-matcher ee) -- cgit v1.2.3