39 lines
1.1 KiB
Racket
39 lines
1.1 KiB
Racket
#lang racket
|
|
|
|
(provide Int Prim Var Var-name Assign Seq Return CProgram interp-CVar% interp-CVar)
|
|
|
|
(require "lvar.rkt")
|
|
(require racket/dict)
|
|
(require racket/struct)
|
|
|
|
(struct CProgram (info labeled-seq) #:transparent)
|
|
|
|
(struct Assign (var exp) #:transparent)
|
|
(struct Seq (stmt tail) #:transparent)
|
|
(struct Return (exp) #:transparent)
|
|
|
|
(define interp-CVar%
|
|
(class interp-LVar-class
|
|
(super-new)
|
|
|
|
(define/public ((interp-stmt env) stmt)
|
|
(match stmt
|
|
[(Assign (Var varname) exp)
|
|
(let ([val ((send this interp-exp env) exp)])
|
|
(dict-set! env varname val))]))
|
|
|
|
(define/public ((interp-seq env) seq)
|
|
(match seq
|
|
[(Seq stmt tail)
|
|
(begin
|
|
((interp-stmt env) stmt)
|
|
((interp-seq env) tail))]
|
|
[(Return exp) ((send this interp-exp env) exp)]))
|
|
|
|
(define/public (interp-cprogram program)
|
|
(match program
|
|
[(CProgram _ labeled-seq) ((interp-seq (make-hash)) (cdar labeled-seq))]))))
|
|
|
|
(define (interp-CVar program)
|
|
(send (new interp-CVar%) interp-cprogram program))
|