fully-expanded-grammar-no-set.rkt (3521B)
1 #lang racket/base 2 3 ;; This file is not used by the project, but can be used as a base for macros 4 ;; which need to parse the result of local-expand. For example, the file 5 ;; fully-expanded-grammar-extract-bindings.rkt is based on this one. 6 7 (require (rename-in syntax/parse [...+ …+]) 8 (rename-in racket/base [... …]) 9 (for-template '#%kernel) 10 (for-syntax racket/base)) 11 12 (provide disallow-set!-in-expression) 13 14 (define whole-expr (make-parameter #f)) 15 16 (define (disallow-set!-in-expression e) 17 (parameterize ([whole-expr e]) 18 (syntax-parse e [:expr 'ok]))) 19 20 (define-syntax-class top-level-form 21 #:literals (#%expression module #%plain-module-begin begin begin-for-syntax) 22 (pattern :general-top-level-form) 23 (pattern (#%expression :expr)) 24 (pattern (module :id _module-path 25 (#%plain-module-begin 26 :module-level-form …))) 27 (pattern (begin :top-level-form …)) 28 (pattern (begin-for-syntax :top-level-form …))) 29 30 (define-syntax-class module-level-form 31 #:literals (#%provide begin-for-syntax #%declare) 32 (pattern :general-top-level-form) 33 (pattern (#%provide _raw-provide-spec …)) 34 (pattern (begin-for-syntax :module-level-form …)) 35 (pattern :submodule-form) 36 (pattern (#%declare _declaration-keyword …))) 37 38 (define-syntax-class submodule-form 39 #:literals (module #%plain-module-begin module* ) 40 (pattern (module :id _module-path 41 (#%plain-module-begin 42 :module-level-form …))) 43 (pattern (module* :id _module-path 44 (#%plain-module-begin 45 :module-level-form …))) 46 (pattern (module* :id #f 47 (#%plain-module-begin 48 :module-level-form …)))) 49 50 (define-syntax-class general-top-level-form 51 #:literals (define-values define-syntaxes #%require) 52 (pattern :expr) 53 (pattern (define-values (:id …) :expr)) 54 (pattern (define-syntaxes (:id …) :expr)) 55 (pattern (#%require _raw-require-spec …))) 56 57 (define-syntax-class expr 58 #:literals (lambda case-lambda if begin begin0 59 let-values letrec-values letrec-syntaxes+values 60 set! quote quote-syntax 61 with-continuation-mark 62 #%app #%top #%expression #%variable-reference) 63 (pattern :id) 64 (pattern (lambda :formals :expr …+)) 65 (pattern (case-lambda (:formals :expr …+) …)) 66 (pattern (if :expr :expr :expr)) 67 (pattern (begin :expr …+)) 68 (pattern (begin0 :expr :expr …)) 69 70 (pattern (let-values ([(:id …) :expr] …) 71 :expr …+)) 72 (pattern (letrec-values ([(:id …) :expr] …) 73 :expr …+)) 74 (pattern (letrec-syntaxes+values ([(:id …) :expr] …) 75 ([(:id …) :expr] …) 76 :expr …+)) 77 (pattern {~and whole-set ({~and set-id set!} :id :expr)} 78 #:do [(raise-syntax-error 79 'pure 80 "set! is disallowed within pure/stateless and similar forms" 81 #'whole-expr 82 #'whole-set 83 (list #'set-id))]) 84 (pattern (quote _datum)) 85 (pattern (quote-syntax _datum)) 86 (pattern (quote-syntax _datum #:local)) 87 (pattern (with-continuation-mark :expr :expr :expr)) 88 (pattern (#%app :expr …+)) 89 (pattern (#%top . :id)) 90 (pattern (#%expression :expr)) 91 (pattern (#%variable-reference :id)) 92 (pattern (#%variable-reference (#%top . :id))) 93 (pattern (#%variable-reference))) 94 95 (define-syntax-class formals 96 (pattern (:id …)) 97 (pattern (:id …+ . :id)) 98 (pattern :id))