racket/collects/unstable/automata/re-ext.rkt
2011-06-28 02:01:41 -04:00

37 lines
888 B
Racket

#lang racket/base
(require "re.rkt"
(for-syntax syntax/parse
racket/base))
(define-re-transformer seq/close
(syntax-rules ()
[(_)
epsilon]
[(_ a b ...)
(opt (seq a (seq/close b ...)))]))
(define-re-transformer opt
(syntax-rules ()
[(_ pat)
(union epsilon pat)]))
(define-re-transformer plus
(syntax-rules ()
[(_ pat)
(seq pat (star pat))]))
(define-re-transformer rep
(syntax-parser
[(_ pat k:number)
(with-syntax
([(pat_i ...) (build-list (syntax->datum #'k) (λ (i) #'pat))])
#'(seq pat_i ...))]))
(define-re-transformer difference
(syntax-rules ()
[(_ A B)
(intersection A (complement B))]))
(define-re-transformer intersection
(syntax-rules ()
[(_ A B)
(complement (union (complement A) (complement B)))]))
(provide seq/close opt plus rep difference intersection)