splitting up the structures into separate modules; trying to reduce complexity
This commit is contained in:
parent
7fcd2ab13e
commit
049eee32c4
30
compile.rkt
30
compile.rkt
|
@ -1,6 +1,8 @@
|
||||||
#lang typed/racket/base
|
#lang typed/racket/base
|
||||||
|
|
||||||
(require "typed-structs.rkt"
|
(require "expression-structs.rkt"
|
||||||
|
"lexical-structs.rkt"
|
||||||
|
"il-structs.rkt"
|
||||||
"lexical-env.rkt"
|
"lexical-env.rkt"
|
||||||
"helpers.rkt"
|
"helpers.rkt"
|
||||||
"find-toplevel-variables.rkt"
|
"find-toplevel-variables.rkt"
|
||||||
|
@ -202,31 +204,7 @@
|
||||||
after-lambda)))
|
after-lambda)))
|
||||||
|
|
||||||
|
|
||||||
(: collect-lexical-references ((Listof LexicalAddress)
|
|
||||||
->
|
|
||||||
(Listof (U EnvLexicalReference EnvWholePrefixReference))))
|
|
||||||
;; Given a list of lexical addresses, computes a set of unique references.
|
|
||||||
;; Multiple lexical addresses to a single prefix should be treated identically.
|
|
||||||
(define (collect-lexical-references addresses)
|
|
||||||
(let: ([prefix-references : (Setof EnvWholePrefixReference) (new-set)]
|
|
||||||
[lexical-references : (Setof EnvLexicalReference) (new-set)])
|
|
||||||
(let: loop : (Listof (U EnvLexicalReference EnvWholePrefixReference))
|
|
||||||
([addresses : (Listof LexicalAddress) addresses])
|
|
||||||
(cond
|
|
||||||
[(empty? addresses)
|
|
||||||
(append (set->list prefix-references) (set->list lexical-references))]
|
|
||||||
[else
|
|
||||||
(let ([addr (first addresses)])
|
|
||||||
(cond
|
|
||||||
[(LocalAddress? addr)
|
|
||||||
(set-insert! lexical-references
|
|
||||||
(make-EnvLexicalReference (LocalAddress-depth addr)
|
|
||||||
(LocalAddress-pos addr)))
|
|
||||||
(loop (rest addresses))]
|
|
||||||
[(PrefixAddress? addr)
|
|
||||||
(set-insert! prefix-references
|
|
||||||
(make-EnvWholePrefixReference (PrefixAddress-depth addr)))
|
|
||||||
(loop (rest addresses))]))]))))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
36
expression-structs.rkt
Normal file
36
expression-structs.rkt
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#lang typed/racket/base
|
||||||
|
(require "lexical-structs.rkt")
|
||||||
|
|
||||||
|
(provide (all-defined-out))
|
||||||
|
|
||||||
|
;; Expressions
|
||||||
|
|
||||||
|
(define-type ExpressionCore (U Top Constant Var Branch Def Lam Seq #;App))
|
||||||
|
(define-type Expression (U ExpressionCore #;Assign))
|
||||||
|
|
||||||
|
(define-struct: Top ([prefix : Prefix]
|
||||||
|
[code : ExpressionCore]) #:transparent)
|
||||||
|
(define-struct: Constant ([v : Any]) #:transparent)
|
||||||
|
(define-struct: Var ([id : Symbol]) #:transparent)
|
||||||
|
(define-struct: Assign ([variable : Symbol]
|
||||||
|
[value : Expression]) #:transparent)
|
||||||
|
(define-struct: Branch ([predicate : Expression]
|
||||||
|
[consequent : Expression]
|
||||||
|
[alternative : Expression]) #:transparent)
|
||||||
|
(define-struct: Def ([variable : Symbol]
|
||||||
|
[value : Expression]) #:transparent)
|
||||||
|
(define-struct: Lam ([parameters : (Listof Symbol)]
|
||||||
|
[body : Expression]) #:transparent)
|
||||||
|
(define-struct: Seq ([actions : (Listof Expression)]) #:transparent)
|
||||||
|
(define-struct: App ([operator : Expression]
|
||||||
|
[operands : (Listof Expression)]) #:transparent)
|
||||||
|
|
||||||
|
(: last-exp? ((Listof Expression) -> Boolean))
|
||||||
|
(define (last-exp? seq)
|
||||||
|
(null? (cdr seq)))
|
||||||
|
|
||||||
|
(: first-exp ((Listof Expression) -> Expression))
|
||||||
|
(define (first-exp seq) (car seq))
|
||||||
|
|
||||||
|
(: rest-exps ((Listof Expression) -> (Listof Expression)))
|
||||||
|
(define (rest-exps seq) (cdr seq))
|
|
@ -1,5 +1,6 @@
|
||||||
#lang typed/racket/base
|
#lang typed/racket/base
|
||||||
(require "typed-structs.rkt"
|
(require "expression-structs.rkt"
|
||||||
|
"lexical-structs.rkt"
|
||||||
"helpers.rkt"
|
"helpers.rkt"
|
||||||
racket/list)
|
racket/list)
|
||||||
|
|
||||||
|
|
|
@ -2,37 +2,6 @@
|
||||||
(provide (all-defined-out))
|
(provide (all-defined-out))
|
||||||
|
|
||||||
|
|
||||||
;; Expressions
|
|
||||||
|
|
||||||
(define-type ExpressionCore (U Top Constant Var Branch Def Lam Seq #;App))
|
|
||||||
(define-type Expression (U ExpressionCore #;Assign))
|
|
||||||
|
|
||||||
(define-struct: Top ([prefix : Prefix]
|
|
||||||
[code : ExpressionCore]) #:transparent)
|
|
||||||
(define-struct: Constant ([v : Any]) #:transparent)
|
|
||||||
(define-struct: Var ([id : Symbol]) #:transparent)
|
|
||||||
(define-struct: Assign ([variable : Symbol]
|
|
||||||
[value : Expression]) #:transparent)
|
|
||||||
(define-struct: Branch ([predicate : Expression]
|
|
||||||
[consequent : Expression]
|
|
||||||
[alternative : Expression]) #:transparent)
|
|
||||||
(define-struct: Def ([variable : Symbol]
|
|
||||||
[value : Expression]) #:transparent)
|
|
||||||
(define-struct: Lam ([parameters : (Listof Symbol)]
|
|
||||||
[body : Expression]) #:transparent)
|
|
||||||
(define-struct: Seq ([actions : (Listof Expression)]) #:transparent)
|
|
||||||
(define-struct: App ([operator : Expression]
|
|
||||||
[operands : (Listof Expression)]) #:transparent)
|
|
||||||
|
|
||||||
(: last-exp? ((Listof Expression) -> Boolean))
|
|
||||||
(define (last-exp? seq)
|
|
||||||
(null? (cdr seq)))
|
|
||||||
|
|
||||||
(: first-exp ((Listof Expression) -> Expression))
|
|
||||||
(define (first-exp seq) (car seq))
|
|
||||||
|
|
||||||
(: rest-exps ((Listof Expression) -> (Listof Expression)))
|
|
||||||
(define (rest-exps seq) (cdr seq))
|
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -173,27 +142,3 @@
|
||||||
(define-struct: BasicBlock ([name : Symbol]
|
(define-struct: BasicBlock ([name : Symbol]
|
||||||
[stmts : (Listof UnlabeledStatement)]) #:transparent)
|
[stmts : (Listof UnlabeledStatement)]) #:transparent)
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
;; Lexical environments
|
|
||||||
|
|
||||||
;; A toplevel prefix contains a list of toplevel variables.
|
|
||||||
(define-struct: Prefix ([names : (Listof Symbol)])
|
|
||||||
#:transparent)
|
|
||||||
|
|
||||||
;; A compile-time environment is a (listof (listof symbol)).
|
|
||||||
;; A lexical address is either a 2-tuple (depth pos), or 'not-found.
|
|
||||||
(define-type CompileTimeEnvironment (Listof (U (Listof Symbol)
|
|
||||||
Prefix)))
|
|
||||||
(define-type LexicalAddress (U LocalAddress PrefixAddress))
|
|
||||||
|
|
||||||
(define-struct: LocalAddress ([depth : Natural]
|
|
||||||
[pos : Natural])
|
|
||||||
;; These need to be treated transparently for equality checking.
|
|
||||||
#:transparent)
|
|
||||||
(define-struct: PrefixAddress ([depth : Natural]
|
|
||||||
[pos : Natural]
|
|
||||||
[name : Symbol])
|
|
||||||
;; These need to be treated transparently for equality checking.
|
|
||||||
#:transparent)
|
|
|
@ -1,8 +1,14 @@
|
||||||
#lang typed/racket/base
|
#lang typed/racket/base
|
||||||
|
|
||||||
(require racket/list
|
(require racket/list
|
||||||
"typed-structs.rkt")
|
"il-structs.rkt"
|
||||||
(provide find-variable extend-lexical-environment lexical-environment-pop-depth)
|
"lexical-structs.rkt"
|
||||||
|
"sets.rkt")
|
||||||
|
(provide find-variable
|
||||||
|
extend-lexical-environment
|
||||||
|
lexical-environment-pop-depth
|
||||||
|
collect-lexical-references
|
||||||
|
lexical-references->compile-time-environment)
|
||||||
|
|
||||||
|
|
||||||
;; find-variable: symbol compile-time-environment -> lexical-address
|
;; find-variable: symbol compile-time-environment -> lexical-address
|
||||||
|
@ -51,4 +57,49 @@
|
||||||
[(Prefix? (first cenv))
|
[(Prefix? (first cenv))
|
||||||
1]
|
1]
|
||||||
[(list? (first cenv))
|
[(list? (first cenv))
|
||||||
1]))
|
1]))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(: collect-lexical-references ((Listof LexicalAddress)
|
||||||
|
->
|
||||||
|
(Listof (U EnvLexicalReference EnvWholePrefixReference))))
|
||||||
|
;; Given a list of lexical addresses, computes a set of unique references.
|
||||||
|
;; Multiple lexical addresses to a single prefix should be treated identically.
|
||||||
|
(define (collect-lexical-references addresses)
|
||||||
|
(let: ([prefix-references : (Setof EnvWholePrefixReference) (new-set)]
|
||||||
|
[lexical-references : (Setof EnvLexicalReference) (new-set)])
|
||||||
|
(let: loop : (Listof (U EnvLexicalReference EnvWholePrefixReference))
|
||||||
|
([addresses : (Listof LexicalAddress) addresses])
|
||||||
|
(cond
|
||||||
|
[(empty? addresses)
|
||||||
|
(append (set->list prefix-references) (set->list lexical-references))]
|
||||||
|
[else
|
||||||
|
(let ([addr (first addresses)])
|
||||||
|
(cond
|
||||||
|
[(LocalAddress? addr)
|
||||||
|
(set-insert! lexical-references
|
||||||
|
(make-EnvLexicalReference (LocalAddress-depth addr)
|
||||||
|
(LocalAddress-pos addr)))
|
||||||
|
(loop (rest addresses))]
|
||||||
|
[(PrefixAddress? addr)
|
||||||
|
(set-insert! prefix-references
|
||||||
|
(make-EnvWholePrefixReference (PrefixAddress-depth addr)))
|
||||||
|
(loop (rest addresses))]))]))))
|
||||||
|
|
||||||
|
|
||||||
|
(: lexical-references->compile-time-environment ((Listof (U EnvLexicalReference EnvWholePrefixReference))
|
||||||
|
CompileTimeEnvironment
|
||||||
|
-> CompileTimeEnvironment))
|
||||||
|
(define (lexical-references->compile-time-environment refs cenv)
|
||||||
|
cenv
|
||||||
|
#;(cond
|
||||||
|
[(empty? refs)
|
||||||
|
cenv]
|
||||||
|
[else
|
||||||
|
(let ([a-ref (first refs)])
|
||||||
|
(cond
|
||||||
|
[(EnvLexicalReference? a-ref)
|
||||||
|
...]))]))
|
||||||
|
|
||||||
|
|
27
lexical-structs.rkt
Normal file
27
lexical-structs.rkt
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#lang typed/racket/base
|
||||||
|
|
||||||
|
(provide (all-defined-out))
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
;; Lexical environments
|
||||||
|
|
||||||
|
;; A toplevel prefix contains a list of toplevel variables.
|
||||||
|
(define-struct: Prefix ([names : (Listof Symbol)])
|
||||||
|
#:transparent)
|
||||||
|
|
||||||
|
;; A compile-time environment is a (listof (listof symbol)).
|
||||||
|
;; A lexical address is either a 2-tuple (depth pos), or 'not-found.
|
||||||
|
(define-type CompileTimeEnvironment (Listof (U (Listof Symbol)
|
||||||
|
Prefix)))
|
||||||
|
(define-type LexicalAddress (U LocalAddress PrefixAddress))
|
||||||
|
|
||||||
|
(define-struct: LocalAddress ([depth : Natural]
|
||||||
|
[pos : Natural])
|
||||||
|
;; These need to be treated transparently for equality checking.
|
||||||
|
#:transparent)
|
||||||
|
(define-struct: PrefixAddress ([depth : Natural]
|
||||||
|
[pos : Natural]
|
||||||
|
[name : Symbol])
|
||||||
|
;; These need to be treated transparently for equality checking.
|
||||||
|
#:transparent)
|
Loading…
Reference in New Issue
Block a user