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