83 lines
2.7 KiB
Racket
83 lines
2.7 KiB
Racket
#lang racket
|
|
|
|
(require "test-util.rkt")
|
|
(require "uniquify.rkt")
|
|
(require "remove-complex-oper.rkt")
|
|
(require "explicate-control.rkt")
|
|
(require "rvar.rkt")
|
|
(require "cvar.rkt")
|
|
|
|
(define programs
|
|
(list
|
|
(Program '() (Prim '+ (list (Int 2) (Int 3))))
|
|
(Program '() (Prim '+ (list (Prim '- (list (Int 2))) (Int 3))))
|
|
(Program '()
|
|
(Let 'y (Let 'x (Int 20)
|
|
(Prim '+ (list (Var 'x) (Let 'x (Int 22) (Var 'x)))))
|
|
(Var 'y)))
|
|
(Program '()
|
|
(Let 'a (Int 42)
|
|
(Let 'b (Var 'a)
|
|
(Var 'b))))
|
|
|
|
(Program '()
|
|
(Prim '+ (list (Let 'x (Prim '+ (list (Prim '- (list (Int 1))) (Int 2)))
|
|
(Prim '+ (list (Var 'x) (Int 2))))
|
|
(Prim '+ (list (Int 4) (Int 5))))))))
|
|
|
|
(define (pass program) (explicate-control (remove-complex-opera* (uniquify program))))
|
|
(define (pass-2 program) (explicate-control (remove-complex-opera*-2 (uniquify program))))
|
|
|
|
(test-eq
|
|
(pass (list-ref programs 0))
|
|
(CProgram '()
|
|
(list `(start .
|
|
,(Return (Prim '+ (list (Int 2) (Int 3))))))))
|
|
|
|
(test-eq
|
|
(pass-2 (list-ref programs 0))
|
|
(CProgram '()
|
|
(list `(start .
|
|
,(Seq (Assign (Var 'tmp.0) (Int 2))
|
|
(Seq (Assign (Var 'tmp.1) (Int 3))
|
|
(Seq (Assign (Var 'tmp.2) (Prim '+ (list (Var 'tmp.0) (Var 'tmp.1))))
|
|
(Return (Var 'tmp.2)))))))))
|
|
|
|
(test-eq
|
|
(pass (list-ref programs 1))
|
|
(CProgram '()
|
|
(list `(start .
|
|
,(Seq (Assign (Var 'tmp.0) (Prim '- (list (Int 2))))
|
|
(Return (Prim '+ (list (Var 'tmp.0) (Int 3)))))))))
|
|
|
|
(test-eq
|
|
(pass (list-ref programs 2))
|
|
(CProgram '()
|
|
`((start .
|
|
,(Seq (Assign (Var 'x.1) (Int 20))
|
|
(Seq (Assign (Var 'x.2) (Int 22))
|
|
(Seq (Assign (Var 'y.1) (Prim '+ (list (Var 'x.1) (Var 'x.2))))
|
|
(Return (Var 'y.1)))))))))
|
|
|
|
(test-eq
|
|
(pass (list-ref programs 3))
|
|
(CProgram '()
|
|
`((start .
|
|
,(Seq (Assign (Var 'a.1) (Int 42))
|
|
(Seq (Assign (Var 'b.1) (Var 'a.1))
|
|
(Return (Var 'b.1))))))))
|
|
|
|
(test-eq
|
|
(pass (list-ref programs 4))
|
|
(CProgram '()
|
|
`((start .
|
|
,(Seq (Assign (Var 'tmp.0) (Prim '- (list (Int 1))))
|
|
(Seq (Assign (Var 'x.1) (Prim '+ (list (Var 'tmp.0) (Int 2))))
|
|
(Seq (Assign (Var 'tmp.1) (Prim '+ (list (Var 'x.1) (Int 2))))
|
|
(Seq (Assign (Var 'tmp.2) (Prim '+ (list (Int 4) (Int 5))))
|
|
(Return (Prim '+ (list (Var 'tmp.1) (Var 'tmp.2))))))))))))
|
|
|
|
(for ([program programs])
|
|
(test-eq (interp-RVar program)
|
|
(interp-CVar (pass program))))
|