Fixes a bug in the Redex term generator
This commit is contained in:
parent
d55cdb7785
commit
7243029786
|
@ -354,12 +354,12 @@
|
|||
(let ([cross? (not (symbol? pat))])
|
||||
(λ (r s a e f)
|
||||
(values (gen-nt (if any? sexpc langc) p cross? r s a f) e)))]
|
||||
[(struct binder ((or (app (symbol-match named-nt-rx) (? symbol? p)) p)))
|
||||
(let ([g (recur p)])
|
||||
[(? binder?)
|
||||
(let ([g (recur (binder-pattern pat))])
|
||||
(λ (r s a e f)
|
||||
(generate/prior pat e (λ () (g r s a e f)))))]
|
||||
[(struct mismatch (_ (app (symbol-match mismatch-nt-rx) p)))
|
||||
(let ([g (recur p)])
|
||||
[(? mismatch?)
|
||||
(let ([g (recur (mismatch-pattern pat))])
|
||||
(set! mismatches? #t)
|
||||
(λ (r s a e f)
|
||||
(let-values ([(ts e) (g r s a e f)])
|
||||
|
@ -451,13 +451,18 @@
|
|||
(let ([nts '()])
|
||||
(let loop ([pat pat])
|
||||
(match pat
|
||||
[(? symbol? pat)
|
||||
(when ((is-nt? lang) (symbol->nt pat))
|
||||
(set! nts (cons (cons #f (symbol->nt pat)) nts)))]
|
||||
[(? binder?)
|
||||
(set! nts (cons (cons #f (binder-pattern pat)) nts))]
|
||||
[(? mismatch?)
|
||||
(set! nts (cons (cons #f (mismatch-pattern pat)) nts))]
|
||||
[(? symbol?)
|
||||
(when ((is-nt? lang) pat)
|
||||
(set! nts (cons (cons #f pat) nts)))]
|
||||
[`(cross ,(? symbol? x-nt))
|
||||
(set! nts (cons (cons #t x-nt) nts))]
|
||||
[`(variable-except ,s ...) (void)]
|
||||
[`(variable-prefix ,p) (void)]
|
||||
[`(name ,_ ,p) (loop p)]
|
||||
[`() (void)]
|
||||
[(struct ellipsis (_ p _ _))
|
||||
(loop p)]
|
||||
|
@ -535,8 +540,20 @@
|
|||
(and match (cadr match) (string->symbol (cadr match))))))
|
||||
|
||||
(define-struct class (id) #:inspector (make-inspector))
|
||||
|
||||
(define-struct mismatch (id group) #:inspector (make-inspector))
|
||||
(define mismatch-pattern
|
||||
(match-lambda
|
||||
[(struct mismatch (_ name))
|
||||
((symbol-match mismatch-nt-rx) name)]))
|
||||
|
||||
(define-struct binder (name) #:inspector (make-inspector))
|
||||
(define binder-pattern
|
||||
(match-lambda
|
||||
[(struct binder (name))
|
||||
(match ((symbol-match named-nt-rx) name)
|
||||
[#f name]
|
||||
[p p])]))
|
||||
|
||||
;; name: (or/c symbol? mismatch?)
|
||||
;; The generator records `name' in the environment when generating an ellipsis,
|
||||
|
|
|
@ -42,11 +42,14 @@
|
|||
(begin (output (λ () expr)) 'no-violation))
|
||||
expected))]))
|
||||
|
||||
(define find-base-cases/unparsed
|
||||
(compose find-base-cases parse-language))
|
||||
|
||||
(let ()
|
||||
(define-language lc
|
||||
(e x (e e) (λ (x) e))
|
||||
(x variable))
|
||||
(let ([bc (find-base-cases lc)])
|
||||
(let ([bc (find-base-cases/unparsed lc)])
|
||||
(test (to-table (base-cases-non-cross bc))
|
||||
'((e . (1 2 2)) (x . (0))))
|
||||
(test (to-table (base-cases-cross bc))
|
||||
|
@ -55,7 +58,7 @@
|
|||
(let ()
|
||||
(define-language lang
|
||||
(e (e e)))
|
||||
(let ([bc (find-base-cases lang)])
|
||||
(let ([bc (find-base-cases/unparsed lang)])
|
||||
(test (to-table (base-cases-non-cross bc)) '((e . (inf))))
|
||||
(test (to-table (base-cases-cross bc)) '((e-e . (0 inf inf))))))
|
||||
|
||||
|
@ -63,7 +66,7 @@
|
|||
(define-language lang
|
||||
(a 1 2 3)
|
||||
(b a (a_1 b_!_1)))
|
||||
(let ([bc (find-base-cases lang)])
|
||||
(let ([bc (find-base-cases/unparsed lang)])
|
||||
(test (to-table (base-cases-non-cross bc))
|
||||
'((a . (0 0 0)) (b . (1 2))))
|
||||
(test (to-table (base-cases-cross bc))
|
||||
|
@ -78,7 +81,7 @@
|
|||
(v (λ (x) e)
|
||||
number)
|
||||
(x variable))
|
||||
(let ([bc (find-base-cases lc)])
|
||||
(let ([bc (find-base-cases/unparsed lc)])
|
||||
(test (to-table (base-cases-non-cross bc))
|
||||
'((e . (2 2 1 1)) (v . (2 0)) (x . (0))))
|
||||
(test (to-table (base-cases-cross bc))
|
||||
|
@ -88,10 +91,12 @@
|
|||
(let ()
|
||||
(define-language L
|
||||
(x (variable-prefix x)
|
||||
(variable-except y))
|
||||
(variable-except y)
|
||||
(name x 1)
|
||||
(name y 1))
|
||||
(y y))
|
||||
(test (hash-ref (base-cases-non-cross (find-base-cases L)) 'x)
|
||||
'(0 0)))
|
||||
(test (hash-ref (base-cases-non-cross (find-base-cases/unparsed L)) 'x)
|
||||
'(0 0 0 0)))
|
||||
|
||||
(define (make-random . nums)
|
||||
(let ([nums (box nums)])
|
||||
|
@ -542,7 +547,7 @@
|
|||
(decisions #:nt (patterns first)))
|
||||
47)
|
||||
|
||||
(test (hash-ref (base-cases-non-cross (find-base-cases name-collision)) 'e-e)
|
||||
(test (hash-ref (base-cases-non-cross (find-base-cases/unparsed name-collision)) 'e-e)
|
||||
'(0)))
|
||||
|
||||
(let ()
|
||||
|
|
Loading…
Reference in New Issue
Block a user