(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)) ((#:?