Convert c1 to new EoC data structures
Don't port partial evaluator for the moment
This commit is contained in:
parent
5487761f54
commit
bad45de00a
24
c1.rkt
24
c1.rkt
|
|
@ -2,30 +2,6 @@
|
||||||
|
|
||||||
(require racket/fixnum)
|
(require racket/fixnum)
|
||||||
|
|
||||||
(define ast1.4 `(- 8))
|
|
||||||
(define ast1.1 `(+ (read) ,ast1.4))
|
|
||||||
|
|
||||||
(define (read-fixnum)
|
|
||||||
(let ([r (read)])
|
|
||||||
(cond
|
|
||||||
[(fixnum? r) r]
|
|
||||||
[else (error "invalid fixnum in input: " r)])))
|
|
||||||
|
|
||||||
|
|
||||||
(define (interp-exp sexp)
|
|
||||||
(match sexp
|
|
||||||
[(? fixnum?) sexp]
|
|
||||||
[`(read) (read-fixnum)]
|
|
||||||
[`(- ,e) (fx- 0 (interp-exp e))]
|
|
||||||
[`(+ ,e1 ,e2) (fx+ (interp-exp e1) (interp-exp e2))]))
|
|
||||||
|
|
||||||
|
|
||||||
(define (interp-R0 p)
|
|
||||||
(match p
|
|
||||||
[`(program ,e) (interp-exp e)]))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(define (pe-arith p)
|
(define (pe-arith p)
|
||||||
(match p
|
(match p
|
||||||
[`(program ,e) (pe-exp e)]))
|
[`(program ,e) (pe-exp e)]))
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
#lang racket
|
||||||
|
|
||||||
|
(require racket/fixnum)
|
||||||
|
|
||||||
|
(provide Int Prim Program interp-RInt)
|
||||||
|
|
||||||
|
(struct Int (value))
|
||||||
|
(struct Prim (op args))
|
||||||
|
|
||||||
|
(struct Program (info body))
|
||||||
|
|
||||||
|
(define (read-fixnum)
|
||||||
|
(let ([r (read)])
|
||||||
|
(cond
|
||||||
|
[(fixnum? r) r]
|
||||||
|
[else (error "invalid fixnum in input: " r)])))
|
||||||
|
|
||||||
|
|
||||||
|
(define (interp-exp sexp)
|
||||||
|
(match sexp
|
||||||
|
[(Int n) n]
|
||||||
|
[(Prim 'read '()) (read-fixnum)]
|
||||||
|
[(Prim '- (list e)) (fx- 0 (interp-exp e))]
|
||||||
|
[(Prim '+ (list e1 e2)) (fx+ (interp-exp e1) (interp-exp e2))]))
|
||||||
|
|
||||||
|
(define (interp-RInt p)
|
||||||
|
(match p
|
||||||
|
[(Program '() body) (interp-exp body)]))
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
#lang racket
|
||||||
|
|
||||||
|
(require "test-util.rkt")
|
||||||
|
(require "rint.rkt")
|
||||||
|
|
||||||
|
(define eight (Int 8))
|
||||||
|
(define rd (Prim 'read '()))
|
||||||
|
(define neg-eight (Prim '- (list eight)))
|
||||||
|
(define ast1.1 (Prim '+ (list rd neg-eight)))
|
||||||
|
(define program (Program '() ast1.1))
|
||||||
|
|
||||||
|
(test-eq -5
|
||||||
|
(with-input-from-num-list '(3)
|
||||||
|
(lambda () (interp-RInt program))))
|
||||||
|
|
||||||
|
|
@ -1,8 +1,13 @@
|
||||||
#lang racket
|
#lang racket
|
||||||
|
|
||||||
(require racket/system)
|
(require racket/system)
|
||||||
|
(require racket/port)
|
||||||
|
|
||||||
(provide test-eq compile-arm-asm run-arm-executable)
|
(provide test-eq with-input-from-num-list compile-arm-asm run-arm-executable)
|
||||||
|
|
||||||
|
(define (with-input-from-num-list ls proc)
|
||||||
|
(with-input-from-string (string-join (map number->string ls) "\n")
|
||||||
|
proc))
|
||||||
|
|
||||||
(define (test-eq a b)
|
(define (test-eq a b)
|
||||||
(if (equal? a b) (displayln "PASS") (error (format "FAIL: ~a != ~a" a b))))
|
(if (equal? a b) (displayln "PASS") (error (format "FAIL: ~a != ~a" a b))))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue