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
|
#lang racket
|
||||||
|
|
||||||
|
(provide Int Prim Var Let Program interp-RVar-class interp-RVar)
|
||||||
|
|
||||||
(require racket/fixnum)
|
(require racket/fixnum)
|
||||||
(require racket/dict)
|
(require racket/dict)
|
||||||
(require racket/struct)
|
(require racket/struct)
|
||||||
|
|
||||||
(provide Int Prim Var Let Program interp-RVar-class interp-RVar)
|
|
||||||
|
|
||||||
(struct Int (value) #:transparent)
|
(struct Int (value) #:transparent)
|
||||||
(struct Var (name) #:transparent)
|
(struct Var (name) #:transparent)
|
||||||
(struct Prim (op args) #: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