www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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))