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))))
|
||||
(check-each prods delim? "expected production")
|
||||
(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)
|
||||
(syntax-case stx ()
|
||||
|
|
|
@ -1468,6 +1468,12 @@
|
|||
(define-language good-lang (a 1 2))
|
||||
(define-extended-language bad-lang5 good-lang (a) (b 2)))
|
||||
#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 (variable-except a 2 c)) #rx"expected an identifier")
|
||||
|
|
Loading…
Reference in New Issue
Block a user