Add CVar to bril translation
This commit is contained in:
parent
e3636d0b05
commit
7225d9ad0f
|
|
@ -0,0 +1,50 @@
|
|||
#lang racket
|
||||
|
||||
(provide cvar-to-bril)
|
||||
|
||||
(require (prefix-in bril: bril/lang))
|
||||
(require "cvar.rkt")
|
||||
|
||||
(define (cvar-to-bril program)
|
||||
(match program
|
||||
[(CProgram _ body)
|
||||
(bril:Program (list
|
||||
(bril:Function "main" '() '()
|
||||
(apply append (map cvar-labeled-seq-to-bril body)))))]))
|
||||
|
||||
(define (cvar-labeled-seq-to-bril labeled-seq)
|
||||
(match labeled-seq
|
||||
[(cons label seq)
|
||||
(cons
|
||||
(bril:Label (symbol->string label))
|
||||
(cvar-seq-to-bril seq))]))
|
||||
|
||||
(define (cvar-seq-to-bril seq)
|
||||
(match seq
|
||||
[(Seq stmt tail)
|
||||
(append
|
||||
(cvar-stmt-to-bril stmt)
|
||||
(cvar-seq-to-bril tail))]
|
||||
[(Return var)
|
||||
(list (bril:EffectInstr 'return (list (symbol->string (Var-name var)))
|
||||
'() '()))]))
|
||||
|
||||
(define (cvar-stmt-to-bril stmt)
|
||||
(match stmt
|
||||
[(Assign (Var varname) rhs) (generate-bril-instrs (symbol->string varname) rhs)]))
|
||||
|
||||
(define (generate-bril-instrs dest expr)
|
||||
(match expr
|
||||
[(Int n)
|
||||
(list (bril:ConstantInstr dest (bril:Type 'int) n))]
|
||||
[(Prim '+ (list (Var v1) (Var v2)))
|
||||
(list (bril:ValueInstr 'add dest (bril:Type 'int)
|
||||
(list (symbol->string v1)
|
||||
(symbol->string v2))
|
||||
'() '()))]
|
||||
[(Prim '- (list (Var v1)))
|
||||
(list (bril:ConstantInstr dest (bril:Type 'int) 0)
|
||||
(bril:ValueInstr 'sub dest (bril:Type 'int)
|
||||
(list dest
|
||||
(symbol->string v1))
|
||||
'() '()))]))
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
#lang racket
|
||||
|
||||
(require "test-util.rkt")
|
||||
(require "cvar-to-bril.rkt")
|
||||
(require "uniquify.rkt")
|
||||
(require "remove-complex-oper.rkt")
|
||||
(require "explicate-control.rkt")
|
||||
(require "rvar.rkt")
|
||||
(require bril/interpreter)
|
||||
|
||||
(define listings
|
||||
(list
|
||||
(Program '() (Prim '+ (list (Int 1) (Int 2))))))
|
||||
|
||||
(define (evaluate-bril-main bril-program)
|
||||
(cadr (interp-bril bril-program "main")))
|
||||
|
||||
(define (pass program)
|
||||
(cvar-to-bril (explicate-control (remove-complex-opera*-2 (uniquify program)))))
|
||||
|
||||
(for ([program listings])
|
||||
(test-eq (interp-RVar (list-ref listings 0))
|
||||
(evaluate-bril-main (pass (list-ref listings 0)))))
|
||||
|
||||
Loading…
Reference in New Issue