eoc/explicate-control.scm

30 lines
884 B
Scheme

#lang racket
(require racket/fixnum)
(provide explicate-control)
(define (explicate-control sexp)
(match sexp
[`(program ,info ,exp)
`(program ,info ((start . ,(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)]))