From 0929ef05f926bfaa6697e211e341b532fab89d5f Mon Sep 17 00:00:00 2001 From: Enrico Lumetti Date: Sun, 1 May 2022 15:37:44 +0200 Subject: [PATCH] Add CVar language and interpreter --- cvar.rkt | 38 ++++++++++++++++++++++++++++++++++++++ rvar.rkt | 4 ++-- test-cvar.rkt | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 cvar.rkt create mode 100644 test-cvar.rkt diff --git a/cvar.rkt b/cvar.rkt new file mode 100644 index 0000000..316e7ab --- /dev/null +++ b/cvar.rkt @@ -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)) diff --git a/rvar.rkt b/rvar.rkt index 94c5d82..b144363 100644 --- a/rvar.rkt +++ b/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) diff --git a/test-cvar.rkt b/test-cvar.rkt new file mode 100644 index 0000000..d2c43f4 --- /dev/null +++ b/test-cvar.rkt @@ -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)))