37 lines
888 B
Racket
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)
|