fully-expanded-grammar.rkt (3132B)
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 syntax/parse 8 phc-toolkit/untyped 9 (for-template '#%kernel)) 10 11 (provide top-level-form 12 module-level-form 13 submodule-form 14 general-top-level-form 15 expr 16 formals) 17 18 (define-syntax-class top-level-form 19 #:literals (#%expression module #%plain-module-begin begin begin-for-syntax) 20 (pattern :general-top-level-form) 21 (pattern (#%expression :expr)) 22 (pattern (module :id _module-path 23 (#%plain-module-begin 24 :module-level-form …))) 25 (pattern (begin :top-level-form …)) 26 (pattern (begin-for-syntax :top-level-form …))) 27 28 (define-syntax-class module-level-form 29 #:literals (#%provide begin-for-syntax #%declare) 30 (pattern :general-top-level-form) 31 (pattern (#%provide _raw-provide-spec …)) 32 (pattern (begin-for-syntax :module-level-form …)) 33 (pattern :submodule-form) 34 (pattern (#%declare _declaration-keyword …))) 35 36 (define-syntax-class submodule-form 37 #:literals (module #%plain-module-begin module* ) 38 (pattern (module :id _module-path 39 (#%plain-module-begin 40 :module-level-form …))) 41 (pattern (module* :id _module-path 42 (#%plain-module-begin 43 :module-level-form …))) 44 (pattern (module* :id #f 45 (#%plain-module-begin 46 :module-level-form …)))) 47 48 (define-syntax-class general-top-level-form 49 #:literals (define-values define-syntaxes #%require) 50 (pattern :expr) 51 (pattern (define-values (:id …) :expr)) 52 (pattern (define-syntaxes (:id …) :expr)) 53 (pattern (#%require _raw-require-spec …))) 54 55 (define-syntax-class expr 56 #:literals (lambda case-lambda if begin begin0 57 let-values letrec-values letrec-syntaxes+values 58 set! quote quote-syntax 59 with-continuation-mark 60 #%app #%top #%expression #%variable-reference) 61 (pattern :id) 62 (pattern (lambda :formals :expr …+)) 63 (pattern (case-lambda (:formals :expr …+) …)) 64 (pattern (if :expr :expr :expr)) 65 (pattern (begin :expr …+)) 66 (pattern (begin0 :expr :expr …)) 67 68 (pattern (let-values ([(:id …) :expr] …) 69 :expr …+)) 70 (pattern (letrec-values ([(:id …) :expr] …) 71 :expr …+)) 72 (pattern (letrec-syntaxes+values ([(:id …) :expr] …) 73 ([(:id …) :expr] …) 74 :expr …+)) 75 (pattern (set! :id :expr)) 76 (pattern (quote _datum)) 77 (pattern (quote-syntax _datum)) 78 (pattern (quote-syntax _datum #:local)) 79 (pattern (with-continuation-mark :expr :expr :expr)) 80 (pattern (#%app :expr …+)) 81 (pattern (#%top . :id)) 82 (pattern (#%expression :expr)) 83 (pattern (#%variable-reference :id)) 84 (pattern (#%variable-reference (#%top . :id))) 85 (pattern (#%variable-reference))) 86 87 (define-syntax-class formals 88 (pattern (:id …)) 89 (pattern (:id …+ . :id)) 90 (pattern :id))