156 lines
3.4 KiB
Racket
156 lines
3.4 KiB
Racket
#lang racket
|
|
(require unstable/automata/machine
|
|
unstable/automata/re
|
|
unstable/automata/re-ext
|
|
unstable/match
|
|
tests/eli-tester)
|
|
|
|
(define-syntax-rule (test-re* R (succ ...) (fail ...))
|
|
(let ()
|
|
(define r (re R))
|
|
(test #:failure-prefix (format "~s" 'R)
|
|
(test
|
|
(machine-accepts? r succ) ...
|
|
(not (machine-accepts? r fail)) ...))))
|
|
(define-syntax-rule (test-re R (succ ...) (fail ...))
|
|
(test (test-re* R (succ ...) (fail ...))
|
|
(test-re* (complement R) (fail ...) (succ ...))))
|
|
|
|
(test
|
|
(test-re epsilon
|
|
[(list)]
|
|
[(list 0)])
|
|
|
|
(test-re nullset
|
|
[]
|
|
[(list) (list 1)])
|
|
|
|
(test-re "A"
|
|
[(list "A")]
|
|
[(list)
|
|
(list "B")])
|
|
|
|
(test-re (complement "A")
|
|
[(list)
|
|
(list "B")
|
|
(list "A" "A")]
|
|
[(list "A")])
|
|
|
|
(test-re (union 0 1)
|
|
[(list 1)
|
|
(list 0)]
|
|
[(list)
|
|
(list 0 1)
|
|
(list 0 1 1)])
|
|
|
|
(test-re (seq 0 1)
|
|
[(list 0 1)]
|
|
[(list)
|
|
(list 0)
|
|
(list 0 1 1)])
|
|
|
|
(test-re (star 0)
|
|
[(list)
|
|
(list 0)
|
|
(list 0 0)]
|
|
[(list 1)])
|
|
|
|
(test-re (opt "A")
|
|
[(list)
|
|
(list "A")]
|
|
[(list "B")])
|
|
|
|
(test-re (plus "A")
|
|
[(list "A")
|
|
(list "A" "A")]
|
|
[(list)])
|
|
|
|
(test-re (rep "A" 3)
|
|
[(list "A" "A" "A")]
|
|
[(list)
|
|
(list "A")
|
|
(list "A" "A")])
|
|
|
|
(test-re (difference (? even?) 2)
|
|
[(list 4)
|
|
(list 6)]
|
|
[(list 3)
|
|
(list 2)])
|
|
|
|
(test-re (intersection (? even?) 2)
|
|
[(list 2)]
|
|
[(list 1)
|
|
(list 4)])
|
|
|
|
(test-re (complement (seq "A" (opt "B")))
|
|
[(list "A" "B" "C")]
|
|
[(list "A")
|
|
(list "A" "B")])
|
|
|
|
(test-re (seq epsilon 1)
|
|
[(list 1)]
|
|
[(list 0)
|
|
(list)])
|
|
|
|
(test-re (seq 1 epsilon)
|
|
[(list 1)]
|
|
[(list 0)
|
|
(list)])
|
|
|
|
(test-re (seq epsilon
|
|
(union (seq (star 1) (star (seq 0 (star 1) 0 (star 1))))
|
|
(seq (star 0) (star (seq 1 (star 0) 1 (star 0)))))
|
|
epsilon)
|
|
[(list 1 0 1 0 1)
|
|
(list 0 1 0 1 0)
|
|
(list 1 0 1 1 0 1)
|
|
(list 0 1 0 0 1 0)
|
|
(list)]
|
|
[(list 1 0)])
|
|
|
|
(test-re (star (complement 1))
|
|
[(list 0 2 3 4)
|
|
(list)
|
|
(list 2)
|
|
; This is correct, because the complement machine
|
|
; could accept '(234 5 9 1), which is not '(1)
|
|
; Then the star kicks in and it accepts '(9 0)
|
|
(list 234 5 9 1 9 0)
|
|
(list 1 0)
|
|
(list 0 1)]
|
|
[(list 1)])
|
|
|
|
(test-re (dseq x (== x))
|
|
[(list 0 0)
|
|
(list 1 1)]
|
|
[(list)
|
|
(list 1)
|
|
(list 1 0)])
|
|
|
|
(test-re (seq 1 (seq 2 3))
|
|
[(list 1 2 3)]
|
|
[(list 1)
|
|
(list 1 2)])
|
|
|
|
(test-re (rec x
|
|
(union #f
|
|
(seq 1 ,x)))
|
|
[(list #f)
|
|
(list 1 #f)
|
|
(list 1 1 #f)
|
|
(list 1 1 1 #f)]
|
|
[(list 1)
|
|
(list 2)
|
|
(list 1 1 2)])
|
|
|
|
(test-re (seq/close 1 2 3)
|
|
[(list)
|
|
(list 1)
|
|
(list 1 2)
|
|
(list 1 2 3)]
|
|
[(list 2)
|
|
(list 1 3)
|
|
(list 2 3)
|
|
(list 1 2 3 4)])
|
|
)
|