(define-module (language python modules re) #:use-module (parser stis-parser) #:export(parse-reg)) (define-syntax-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 "(") (Ds ee) (f-tag ")")))) (define f-back (f-or (f-list #:class (mk-token (f-reg! "[AZbBdDsSw]"))) (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 q (ch (f-reg "[][?+*.$^()\\]"))) (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 ee (ff* (f-or! q+? q?? q*? q* q? q+ q-or choice subexpr f-. f-$ f-^ q))) #| (define-syntax with (syntax-rules () ((_ a b c ((s v) . l) . code) (let ((ss v)) (syntax-parameterize ((s (lambda (x) (syntax-case x () ((_ . l) #'(ss . l)) (_ #'ss))))) (with a b c l . code)))) ((_ a b c () . code) ( a b c . code)))) (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)) ((#:?