Add CVar language and interpreter

This commit is contained in:
Enrico Lumetti 2022-05-01 15:37:44 +02:00
parent 5b1f580ed8
commit 0929ef05f9
3 changed files with 79 additions and 2 deletions

38
cvar.rkt Normal file
View File

@ -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))

View File

@ -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)

39
test-cvar.rkt Normal file
View File

@ -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)))