git.fiddlerwoaroof.com
ast/modules.scm
4e987026
 ;;;  File: ast/module-structs   Author: John
 
 ;;; This contains AST structures which define the basic module structure.
 ;;; This is just the skeleton module structure: module, imports, exports,
 ;;; fixity, and default decls.
 
 ;;; AST nodes defined in the file:
 ;;;  module  import-decl  entity  entity-module  entity-var  entity-con
 ;;;  entity-class  entity-abbreviated  entity-datatype  fixity-decl
 
 
 
 ;;; All AST structs inherit from ast-node.  Not instantiated directly.
 ;;; The line-number is a back pointer to the source code.
 
 (define-struct ast-node
   (type-template ast-td)
   (slots
    (line-number (type (maybe source-pointer)) (default '#f))))
 
 (define-struct source-pointer
   (slots
    (line (type int))
    (file (type string))))
 
 ;;; <module> -> module <modid> [<exports>] where <body>
 ;;;          -> <body>
 ;;;
 ;;; <exports> -> ( <export>, ... <export> )
 ;;;
 ;;; <body>   -> { [<impdecls>;] [[<fixdecls>;] <topdecls> [;]] }
 ;;;          -> { <impdecls> [;] }
 ;;;
 ;;; <impdecls> -> <impdecl> ; ... ; <impdecl>
 ;;;
 ;;; <fixdecls> -> <fix> ; ... ; <fix>
 ;;;
 ;;; <topdecls> -> <topdecl> ; ... ; <topdecl>
 ;;;
 ;;; <topdecl> -> <synonym-decl>
 ;;;           -> <algdata-decl>
 ;;;           -> <class-decl>
 ;;;           -> <instance-decl>
 ;;;           -> <default-decl>
 ;;;           -> <sign-decl>
 ;;;           -> <valdef>
 
 ;;; The module struct is used to represent the program internally.  Binary
 ;;; files containing interface information contain these structures.
 ;;; Most compiler passes operate on this structure.  A table maps module
 ;;; names to this structure.  Within the module structure, local names are
 ;;; mapped to definitions.
 
 ;;; Modules are also used to represent interfaces & primitives.
 ;;; Some of the module fields may be blank for non-standard modules.
 
 (define-struct module
   (include ast-node)
   (slots
 
     ;; These slots are required.
 
     (name (type symbol))
     (type (type (enum standard interface extension)))
     (prelude? (type bool) (default '#f))  ; True when symbols define the core
     (interface-module (type (maybe module)) (default '#f))
         ; link to previously compiled interface
 
     ;; The unit is filled in by the compilation system
 
     (unit (type symbol) (default '*undefined*))
 
     ;; The following slots are defined at parse time.
     ;; After a module is dumped, these are all empty.
 
     ;; <exports>, list of exported names
     (exports (type (list entity)) (default '()))
     ;; <impdecls>, local import decls
     (imports (type (list import-decl)) (default '()))
     ;; <fixdecls>, local fixity decls
     (fixities (type (list fixity-decl)) (default '()))
     ;; <synonym-decl>, local type synonym decls
     (synonyms (type (list synonym-decl)) (default '()))
     ;; <algdata-decl>, local data decls
     (algdatas (type (list data-decl)) (default '()))
     ;; <class-decl>, local class decls
     (classes (type (list class-decl)) (default '()))
     ;; <instance-decl>, local instance decls
     (instances (type (list instance-decl)) (default '()))
     ;; <default-decl>, default types
     (annotations (type (list annotation)) (default '()))
     (default (type (maybe default-decl)) (default '#f))
     ;; signatures, pattern, function bindings
     (decls (type (list decl)) (default '()))
 
     ;; These slots are filled in by the type-declaration-analysis phase
     ;; after conversion to definition form
 
     (synonym-defs (type (list synonym)) (default '()))
     (alg-defs (type (list algdata)) (default '()))
     (class-defs (type (list class)) (default '()))
     (instance-defs (type (list instance)) (default '()))
 
 
     ;; The import-export stage creates a set of tables which are used for
     ;; imports and exports and local name resolution.  All of these tables
     ;; are indexed by names.  These tables always deal with definitions.
     ;; Every variable, type, class, instance, and synonym is converted into
     ;; a definition.  Blank definitions are created early (in import/export)
     ;; and different aspects of the definitions are filled in as compilation
     ;; progresses.  The type-related definitions are filled in during
     ;; declaration analysis.  Only definitions are saved when a module is
     ;; written to a file; the ast information is not retained.
 
     ;; Used to avoid copy of Prelude symbols.
     (uses-standard-prelude? (type bool) (default '#f))
     ;; maps symbols in scope to definitions
     (symbol-table (type (table symbol def)) (default (make-table)))
     ;; maps names onto groups.
     (export-table (type (table symbol (list (tuple symbol def))))
 		  (default (make-table)))
     ;; Note: symbol groups are found in classes and data decls.  An
     ;; entire group is denoted by the (..) abbreviation in an entity.
     ;; maps local names onto declared fixities
     (fixity-table (type (table symbol fixity)) (default (make-table)))
     ;; maps defs to local names
     (inverted-symbol-table (type (table symbol symbol)) (default (make-table)))
     ;; Used internally during import-export
     (fresh-exports (type (list (list (tuple symbol def)))) (default '()))
     (exported-modules (type (list module)) (default '()))
 
     ;; These slots are used to support incremental compilation.
 
     ;; vars defined in the module
     (vars (type (list var)) (default '()))
     ;; for incremental compilation
     (inherited-env (type (maybe module)) (default '#f))
     ;; The following slots are for interfaces only
     ;; These store renaming mappings defined in the import decls of
     ;; the interface.  Maps local name onto (module, original name).
     (interface-imports (type (list (tuple symbol (typle symbol symbol))))
 		       (default '()))
     (interface-codefile (type (list string)) (default '()))
     ))
 
 
 ;;; <impdecl> -> import <modid> [<impspec>] [renaming <renamings>]
 ;;;
 ;;; <impspec> -> ( <import> , ... , <import> )
 ;;;           -> hiding ( <import> , ... , <import> )
 ;;;
 ;;; <import>  -> <entity>
 ;;;
 ;;; <renamings> -> ( <renaming>, ... , <renaming> )
 ;;;
 ;;; <renaming>  -> <varid> to <varid>
 ;;;             -> <conid> to <conid>
 
 (define-struct import-decl
   (include ast-node)
   (slots
    ;; <modid>, module imported from
    (module-name (type symbol))
    ;; all: import Foo; by-name: import Foo(x) import Foo()
    (mode (type (enum all by-name)))
    ;; <impspec>, for mode = all this is the hiding list
    (specs (type (list entity)))
    ;; <renamings>, alist maps symbol -> symbol
    (renamings (type (list renaming)))
    ;; place to put corresponding module-ast; filled in by import/export.
    (module (type module) (uninitialized? #t))
    ))
 
 
 ;;; <entity> -> <modid> ..                              entity-module
 ;;           -> <varid>                                 entity-var
 ;;;          -> <tycon>                                 entity-con
 ;;;          -> <tycon> (..)                            entity-abbreviated
 ;;;          -> <tycon> ( <conid> , ... , <conid>)      entity-datatype
 ;;;          -> <tycls> (..)                            entity-abbreviated
 ;;;                note: this is indistinguishable from tycon (..)
 ;;;          -> <tycls> ( <varid> , ... , <varid>)      entity-class
 
 (define-struct entity
   (include ast-node)
   (slots
     (name (type symbol))))
 
 (define-struct entity-module
   (include entity)
   (predicate entity-module?)
   (slots
     ;; a direct pointer to the referenced module added later
     (module (type module) (uninitialized? #t))
     ))
 
 (define-struct entity-var
   (include entity)
   (predicate entity-var?))
 
 (define-struct entity-con
   (include entity)
   (predicate entity-con?))
 
 (define-struct entity-abbreviated
   (include entity)
   (predicate entity-abbreviated?))
 
 (define-struct entity-class
   (include entity)
   (predicate entity-class?)
   (slots
     (methods (type (list symbol)))))
 
 (define-struct entity-datatype
   (include entity)
   (predicate entity-datatype?)
   (slots
     (constructors (type (list symbol)))))
 
 (define-struct renaming
   (include ast-node)
   (slots
     (from (type symbol))
     (to (type symbol))
     (referenced? (type bool))))
 		
 
 ;;; <fix> -> infixl [<digit>] <ops>
 ;;;       -> infixr [<digit>] <ops>
 ;;;       -> infix  [<digit>] <ops>
 ;;;
 ;;; <ops> -> <op> , ... , <op>
 ;;;
 ;;; <op>  -> <varop>
 ;;;       -> <conop>
 
 ;;; Not sure where to put this decl - jcp
 (define-struct fixity
   (include ast-node)
   (slots
     (associativity (type (enum l n r)))
     (precedence (type int))))
 
 (define-struct fixity-decl
   (include ast-node)
   (slots
     (fixity (type fixity))
     ;; <ops>
     (names (type (list symbol)))
     ))