Improves error messages for Redex definition forms

This commit is contained in:
Casey Klein 2011-08-14 11:10:51 -05:00
parent 3b9fcdea92
commit 98eaaebc65
4 changed files with 24 additions and 0 deletions

View File

@ -1331,6 +1331,10 @@
(map (λ (x) (to-lw/proc (datum->syntax #f (cdr (syntax-e x)) x)))
(syntax->list #'(lhs-for-lw ...)))))
(define-for-syntax (not-expression-context stx)
(when (eq? (syntax-local-context) 'expression)
(raise-syntax-error #f "not allowed in an expression context" stx)))
;
;
;
@ -1369,6 +1373,7 @@
(internal-define-metafunction stx #'prev #'rest #f)]))
(define (internal-define-metafunction orig-stx prev-metafunction stx relation?)
(not-expression-context orig-stx)
(syntax-case stx ()
[(lang . rest)
(let ([syn-error-name (if relation?
@ -1532,6 +1537,7 @@
(syntax->list #'(original-names ...)))))))))))))))]))
(define (define-judgment-form/proc stx)
(not-expression-context stx)
(syntax-case stx ()
[(def-form-id lang . body)
(let ([lang #'lang]
@ -2261,6 +2267,7 @@
parsed)
(define-syntax (define-language stx)
(not-expression-context stx)
(syntax-case stx ()
[(form-name lang-name . nt-defs)
(begin

View File

@ -1,3 +1,7 @@
(#rx"define-judgment-form:.*expression context"
([illegal-def (define-judgment-form L #:mode (J) [(J)])])
(values illegal-def))
(#rx"expected an identifier defined by define-language"
([not-lang q])
(define-judgment-form not-lang))

View File

@ -1,3 +1,7 @@
(#rx"define-language:.*expression context"
([illegal-def (define-language L)])
(values illegal-def))
(#rx"define-language:.*unquote disallowed"
([illegal-unquote ,3])
(let ()

View File

@ -1,3 +1,12 @@
(#rx"define-metafunction:.*expression context"
([illegal-def (define-metafunction syn-err-lang [(f) ()])])
(values illegal-def))
(#rx"define-metafunction/extension:.*expression context"
([illegal-def (define-metafunction/extension f syn-err-lang [(g) ()])])
(let ()
(define-metafunction syn-err-lang [(f) ()])
(values illegal-def)))
(#rx"expected a pattern and a right-hand side"
([clause [(f x)]])
(define-metafunction syn-err-lang