Adds a check to the define/extend language parser
This commit is contained in:
parent
f742479d8d
commit
61607c4da1
|
@ -1743,7 +1743,17 @@
|
||||||
stx (or delim (car left))))
|
stx (or delim (car left))))
|
||||||
(check-each prods delim? "expected production")
|
(check-each prods delim? "expected production")
|
||||||
(cons names prods))
|
(cons names prods))
|
||||||
(map parse-non-terminal (syntax->list nt-defs)))
|
(define parsed (map parse-non-terminal (syntax->list nt-defs)))
|
||||||
|
(define defs (make-hash))
|
||||||
|
(for ([p parsed])
|
||||||
|
(define ns (car p))
|
||||||
|
(for ([n ns])
|
||||||
|
(define m (hash-ref defs (syntax-e n) #f))
|
||||||
|
(if m
|
||||||
|
(raise-syntax-error #f "same non-terminal defined twice"
|
||||||
|
stx n (list m))
|
||||||
|
(hash-set! defs (syntax-e n) n))))
|
||||||
|
parsed)
|
||||||
|
|
||||||
(define-syntax (define-language stx)
|
(define-syntax (define-language stx)
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
|
|
|
@ -1468,6 +1468,12 @@
|
||||||
(define-language good-lang (a 1 2))
|
(define-language good-lang (a 1 2))
|
||||||
(define-extended-language bad-lang5 good-lang (a) (b 2)))
|
(define-extended-language bad-lang5 good-lang (a) (b 2)))
|
||||||
#rx"at least one production")
|
#rx"at least one production")
|
||||||
|
(test-syn-err (define-language bad-lang5 (x 1) (x 2)) #rx"same non-terminal" 2)
|
||||||
|
(test-syn-err (define-language bad-lang6 ((x x) 1)) #rx"same non-terminal" 2)
|
||||||
|
(test-syn-err (let ()
|
||||||
|
(define-language good-lang)
|
||||||
|
(define-extended-language bad-lang7 good-lang ((x x) 1)))
|
||||||
|
#rx"same non-terminal" 2)
|
||||||
|
|
||||||
(test-syn-err (redex-match grammar m_1) #rx"before underscore")
|
(test-syn-err (redex-match grammar m_1) #rx"before underscore")
|
||||||
(test-syn-err (redex-match grammar (variable-except a 2 c)) #rx"expected an identifier")
|
(test-syn-err (redex-match grammar (variable-except a 2 c)) #rx"expected an identifier")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user