From 3b9722dcc68a6f56c5f48fb680a43065f5dad341 Mon Sep 17 00:00:00 2001 From: dyoo Date: Thu, 3 Mar 2011 16:25:34 -0500 Subject: [PATCH] simulator.rkt skeleton --- simulator.rkt | 74 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/simulator.rkt b/simulator.rkt index 16d0e44..eb59843 100644 --- a/simulator.rkt +++ b/simulator.rkt @@ -22,10 +22,40 @@ (: step (machine -> machine)) (define (step m) + (let: ([i : Statement (current-instruction m)]) + (cond + [(symbol? i) + (increment-pc m)] + [(AssignImmediateStatement? i) + (error 'step)] + [(AssignPrimOpStatement? i) + (error 'step)] + [(PerformStatement? i) + (error 'step)] + [(GotoStatement? i) + (error 'step)] + [(TestAndBranchStatement? i) + (error 'step)] + [(PopEnvironment? i) + (error 'step)] + [(PushEnvironment? i) + (error 'step)] + [(PushControlFrame? i) + (error 'step)] + [(PopControlFrame? i) + (error 'step)]))) + + + + + +(: current-instruction (machine -> Statement)) +(define (current-instruction m) (match m [(struct machine (val proc env control pc text)) - m - ])) + (vector-ref text pc)])) + + (: val-update (machine Any -> machine)) (define (val-update m v) @@ -73,4 +103,42 @@ [(struct machine (val proc env control pc text)) (make-machine val proc (append (take env skip) (drop env (+ skip n))) - control pc text)])) \ No newline at end of file + control pc text)])) + + +(: control-push (machine Symbol -> machine)) +(define (control-push m l) + (match m + [(struct machine (val proc env control pc text)) + (make-machine val proc env (cons (make-frame l) control) pc text)])) + + +(: control-pop (machine Symbol -> (values machine Symbol))) +(define (control-pop m l) + (match m + [(struct machine (val proc env control pc text)) + (values (make-machine val proc env (rest control) pc text) + (frame-return (first control)))])) + +(: increment-pc (machine -> machine)) +(define (increment-pc m) + (match m + [(struct machine (val proc env control pc text)) + (make-machine val proc env control (add1 pc) text)])) + + +(: jump (machine Symbol -> machine)) +(define (jump m l) + (match m + [(struct machine (val proc env control pc text)) + (make-machine val proc env control (vector-find text l) text)])) + + +(: vector-find (All (A) (Vectorof A) A -> Natural)) +(define (vector-find vec x) + (let: loop : Natural ([i : Natural 0]) + (cond + [(eq? (vector-ref vec i) x) + i] + [else + (loop (add1 i))]))) \ No newline at end of file