git.fiddlerwoaroof.com
ast/exp-structs.scm
4e987026
 ;;; File: ast/exp-structs     Author: John
 
 ;;; These ast structures define the expression syntax
 
 
 ;;; This is simplified; there are additional rules for associativity and
 ;;; precedence.
 ;;;
 ;;; <exp>  -> <lambda-exp>
 ;;;        -> <let-exp>
 ;;;        -> <if-exp>
 ;;;        -> <case-exp>
 ;;;        -> <signature-exp>
 ;;;        -> <exp> <op> <exp>           ; treated like <fn-app>
 ;;;        -> - <exp>
 ;;;        -> <fn-app>
 ;;;        -> <aexp>
 ;;;
 
 (define-struct exp
   (include ast-node))
 
 
 ;;; <lambda-exp> -> \ <apat> ... <apat> -> <exp>
 
 (define-struct lambda
   (include exp)
   (slots
    (pats (type (list pattern)))
    (body (type exp))))
 
 ;;; <let-exp> -> let { <decls> [;] } in <exp>
 
 (define-struct let
   (include exp)
   (slots
    (decls (type (list decl)))
    (body (type exp))))
 
 ;;; <if-exp> -> if <exp> then <exp> else <exp>
 
 (define-struct if
   (include exp)
   (slots
    (test-exp (type exp))
    (then-exp (type exp))
    (else-exp (type exp))))
 
 
 ;;; <case-exp> -> case <exp> of { <alts> [;] }
 ;;;
 ;;; <alts>     -> <alt> ; ... ; <alt>
 ;;;
 ;;; <alt>      -> <pat> -> exp  [where { <decls> [;] } ]
 ;;;            -> <pat> <gdpat> [where { <decls> [;] } ]
 
 (define-struct case
   (include exp)
   (slots
    (exp (type exp))
    (alts (type (list alt)))))
 
 (define-struct alt
   (include ast-node)
   (slots
    (pat (type pattern))
    ;; defined in valdef-structs
    (rhs-list (type (list guarded-rhs)))
    (where-decls (type (list decl)))
    ;; used internally by cfn
    (test (type (maybe exp)) (default '#f))
    ))
 
 ;;; <signature-exp> -> <exp> :: [<context> =>] <atype>
 
 (define-struct exp-sign
   (include exp)
   (slots
    (exp (type exp))
    (signature (type signature))))
 
 
 ;;; <fn-app> -> <exp> <aexp>
 
 (define-struct app
   (include exp)
   (predicate app?)
   (slots
    (fn (type exp))
    (arg (type exp))))
 
 ;;; <aexp> -> <var>                                var-ref
 ;;;        -> <con>                                con-ref
 ;;;        -> <literal>                            const
 ;;;        -> ()                                   constructor is Unit
 ;;;        -> ( <exp> )                            
 ;;;        -> ( <exp> , ... , <exp> )              constructor is a tuple
 ;;;        -> [ <exp> , ... , <exp> ]              list
 ;;;        -> <sequence>
 ;;;        -> [exp> | <qual> , ... , <qual>]       list-comp
 ;;;        -> ( <exp> <op> )                       section-r
 ;;;        -> ( <op> <exp> )                       section-l
 ;;;
 
 (define-struct aexp
   (include exp))
 
 
 (define-struct var-ref
   (include aexp)
   (predicate var-ref?)
   (slots
    (name (type symbol))
    (var (type def))
    (infix? (type bool) (bit #t))))
 
 (define-struct con-ref
   (include aexp)
   (predicate con-ref?)
   (slots
    (name (type symbol))
    (con (type def))
    (infix? (type bool) (bit #t))))
 
 (define-struct const
   (include aexp)
   (slots
    (overloaded? (type bool) (default '#t) (bit #t))))
 
 (define-struct integer-const
   (include const)
   (predicate integer-const?)
   (slots
    (value (type integer))))
 
 (define-struct float-const
   (include const)
   (predicate float-const?)
   (slots
    (numerator (type integer))
    (denominator (type integer))
    (exponent (type integer))))
 
 (define-struct char-const
   (include const)
   (predicate char-const?)
   (slots
    (value (type char))))
 
 (define-struct string-const
   (include const)
   (predicate string-const?)
   (slots
    (value (type string))))
 
 (define-struct list-exp
   (include aexp)
   (slots
    (exps (type (list exp)))))
 
 
 ;;; <sequence> -> [ <exp> .. ]                  sequence
 ;;;            -> [ <exp>, <exp> .. ]           sequence-then
 ;;;            -> [ <exp> .. <exp> ]            sequence-to
 ;;;            -> [ <exp>, <exp> .. <exp> ]     sequence-then-to
 
 (define-struct sequence
   (include aexp)
   (slots
    (from (type exp))))
 
 (define-struct sequence-to
   (include aexp)
   (slots
    (from (type exp))
    (to (type exp))))
 
 
 (define-struct sequence-then
   (include aexp)
   (slots
    (from (type exp))
    (then (type exp))))
 
 (define-struct sequence-then-to
   (include aexp)
   (slots
    (from (type exp))
    (then (type exp))
    (to (type exp))))
 
 (define-struct list-comp
   (include aexp)
   (slots
    (exp (type exp))
    (quals (type (list qual)))))
 
 ;;; Op on left
 (define-struct section-l
   (include aexp)
   (slots
    (exp (type exp))
    (op (type exp))))  ; either con-ref or var-ref
 
 (define-struct section-r
   (include aexp)
   (slots
    (exp (type exp))
    (op (type exp))))  ; either con-ref or var-ref
 
 ;;; <qual> -> <pat> <- <exp>
 ;;;        -> <exp>
 
 (define-struct qual
   (include ast-node))
 
 (define-struct qual-generator
   (include qual)
   (slots
    (pat (type pattern))
    (exp (type exp))))
 
 (define-struct qual-filter
   (include qual)
   (slots
    (exp (type exp))))
 
 
 ;;; This is used as the guard slot in a guarded-rhs to represent lack of a
 ;;; guard.  This is the same as True.
 
 (define-struct omitted-guard ; same as True; should print in the guardless form
   (include exp))
 
 
 ;;; These structures are used by the precedence parser.  
 
 (define-struct pp-exp-list  ; list of expressions & ops for the prec parser
   (include exp)
   (slots
    (exps (type (list exp)))))
 
 ;; This is a place holder for unary negation in pp-exp expressions.  It is
 ;; changed to call the negate function by the prec parser
 
 (define-struct negate
   (include exp)
   (predicate negate?))
 
 ;; Note: operators are var / con structures with infix? set to #t
 
 ;;; The following ast nodes do not directly correspond to Haskell syntax.
 ;;; They are generated during internal code transformations.
 
 ;;; This returns a number (an Int) associated with the constructor of a
 ;;; value.
 
 (define-struct con-number
   (include exp)
   (slots
     (type (type algdata))
     (value (type exp))))
 
 ;;; This selects a value (denoted by the Int in slot) from a data object
 ;;; created by a specified constructor.
 
 (define-struct sel
   (include exp)
   (slots
     (constructor (type con))
     (slot (type int))
     (value (type exp))))
 
 ;;; This returns True if the data value was built with the designated
 ;;; constructor
 
 (define-struct is-constructor
   (include exp)
   (slots 
    (constructor (type con))
    (value (type exp))))
 
 ;;; this is for the type checker only.  It turns off
 ;;; type checking for the argument.
 
 (define-struct cast
   (include exp)     
   (slots 
    (exp (type exp))))
 
 ;; this is used as the body of the let generated by
 ;; dependency analysis
 
 (define-struct void  
   (include exp)
   (predicate void?))
   
 
 ;;; These structures are for the type checker.  They serve as a placeholder
 ;;; for values which will evaluate to methods or dictionaries.
 
 (define-struct placeholder
   (include exp)
   (predicate placeholder?)
   (slots
    (exp (type (maybe exp)))
    (tyvar (type ntype))
    (overloaded-var (type exp))
    (enclosing-decls (type (list decl)))))
 
 (define-struct method-placeholder
   (include placeholder)
   (predicate method-placeholder?)
   (slots
    ;; the method to be dispatched
    (method (type method-var))
    ))
 
 (define-struct dict-placeholder
   (include placeholder)
   (predicate dict-placeholder?)
   (slots
    ;; the class of dictionary needed
    (class (type class))))
 
 (define-struct recursive-placeholder
   (include exp)
   (slots
    (var (type var))
    (enclosing-decls (type (list decl)))
    ;; this holds the code associated with recursive
    ;; functions or variables.  This code instantiates
    ;; the recursive context if necessary.
    (exp (type (maybe exp)))
    ))
 
 ;;; This is used in primitive modules only.  It holds the definition of
 ;;; a lisp level primitive.
 
 (define-struct prim-definition
   (include exp)
   (slots
    (lisp-name (type symbol))
    (atts (type (list (tuple symbol t))))))
 
 ;;; This is used by the type checker to hang on to the original
 ;;; version of a program for message printing.  This is removed by
 ;;; the cfn pass.
 
 (define-struct save-old-exp
   (include exp)
   (slots
    (old-exp (type exp))
    (new-exp (type exp))))
 
 
 ;;; This is used for type checking overloaded methods.
 
 (define-struct overloaded-var-ref
   (include exp)
   (slots
     (var (type var))
     (sig (type ntype))))
 
 
 
 ;;; These are used by the CFN.
 
 
 (define-struct case-block
   (include exp)
   (slots
     (block-name (type symbol))
     (exps       (type (list exp)))))
 
 (define-struct return-from
   (include exp)
   (slots
     (block-name (type symbol))
     (exp        (type exp))))
 
 (define-struct and-exp
   (include exp)
   (slots
     (exps       (type (list exp)))))