Add CVar language and interpreter
This commit is contained in:
parent
5b1f580ed8
commit
0929ef05f9
|
|
@ -0,0 +1,38 @@
|
|||
#lang racket
|
||||
|
||||
(provide Int Prim Var Assign Seq Return CProgram interp-CVar% interp-CVar)
|
||||
|
||||
(require "rvar.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-RVar-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))
|
||||
4
rvar.rkt
4
rvar.rkt
|
|
@ -1,11 +1,11 @@
|
|||
#lang racket
|
||||
|
||||
(provide Int Prim Var Let Program interp-RVar-class interp-RVar)
|
||||
|
||||
(require racket/fixnum)
|
||||
(require racket/dict)
|
||||
(require racket/struct)
|
||||
|
||||
(provide Int Prim Var Let Program interp-RVar-class interp-RVar)
|
||||
|
||||
(struct Int (value) #:transparent)
|
||||
(struct Var (name) #:transparent)
|
||||
(struct Prim (op args) #:transparent)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
#lang racket
|
||||
|
||||
(require "test-util.rkt")
|
||||
(require "cvar.rkt")
|
||||
|
||||
(define seq-1
|
||||
(Return (Int 0)))
|
||||
|
||||
(define seq-2
|
||||
(Seq (Assign (Var 'x) (Int 42))
|
||||
(Return (Int 42))))
|
||||
|
||||
(define seq-3
|
||||
(Seq (Assign (Var 'x) (Int 42))
|
||||
(Return (Prim '+ (list (Int 1) (Var 'x))))))
|
||||
|
||||
(define seq-4
|
||||
(Return (Prim 'read '())))
|
||||
|
||||
(define (make-start-seq seq)
|
||||
(CProgram '() `((start . ,seq))))
|
||||
|
||||
(test-eq
|
||||
(interp-CVar (make-start-seq seq-1))
|
||||
0)
|
||||
|
||||
(test-eq
|
||||
(interp-CVar (make-start-seq seq-2))
|
||||
42)
|
||||
|
||||
(test-eq
|
||||
(interp-CVar (make-start-seq seq-3))
|
||||
43)
|
||||
|
||||
(with-input-from-num-list '(21)
|
||||
(lambda ()
|
||||
(test-eq
|
||||
(interp-CVar (make-start-seq seq-4))
|
||||
21)))
|
||||
Loading…
Reference in New Issue