33 lines
875 B
Scheme
33 lines
875 B
Scheme
#lang racket
|
|
|
|
(require racket/fixnum)
|
|
|
|
(provide explicate-control)
|
|
|
|
(define (explicate-control sexp)
|
|
(match sexp
|
|
[`(program ,info ,exp)
|
|
`(program ,info ,(explicate-control-tail exp))]))
|
|
|
|
; after a remove-complex-opera*, all expressions
|
|
; are compatible with C0
|
|
(define (explicate-control-tail exp)
|
|
(match exp
|
|
[(? fixnum?) `(return ,exp)]
|
|
[(? symbol?) `(return ,exp)]
|
|
[`(read) `(return ,exp)]
|
|
[`(- ,e) `(return ,exp)]
|
|
[`(+ ,e1 ,e2) `(return ,exp)]
|
|
[`(let ([,var ,rexp]) ,body)
|
|
(explicate-control-assign var rexp (explicate-control-tail body))]))
|
|
|
|
; stmt := (assign var exp)
|
|
; tail := (return exp) / (seq stmt tail)
|
|
(define (explicate-control-assign var exp c0-body) `()
|
|
(match exp
|
|
[`(let ([,v ,x]) ,b) (explicate-control-assign v x (explicate-control-assign var b c0-body))]
|
|
[_ `(seq (assign ,var ,exp) ,c0-body)]))
|
|
|
|
|
|
|