Compare commits
3 Commits
595f8a9db4
...
7b8ea0b6f4
| Author | SHA1 | Date |
|---|---|---|
|
|
7b8ea0b6f4 | |
|
|
bad45de00a | |
|
|
5487761f54 |
|
|
@ -1,6 +1,17 @@
|
||||||
.global start
|
.global main
|
||||||
|
|
||||||
|
main:
|
||||||
|
stp x30, x19, [sp, -16]!
|
||||||
|
b start
|
||||||
|
|
||||||
|
conclusion:
|
||||||
|
ldp x30, x19, [sp], 16
|
||||||
|
mov x8, 93 // sys_exit() is at index 93 in kernel functions table
|
||||||
|
svc #0 // generate kernel call sys_exit(123);
|
||||||
|
|
||||||
start:
|
start:
|
||||||
mov x0, 1
|
mov x0, 1
|
||||||
|
str x0, [sp, -16]!
|
||||||
|
ldr x0, [sp], 16
|
||||||
add x0, x0, 41
|
add x0, x0, 41
|
||||||
b conclusion
|
b conclusion
|
||||||
|
|
|
||||||
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)]))
|
||||||
|
|
|
||||||
43
c2.rkt
43
c2.rkt
|
|
@ -1,43 +0,0 @@
|
||||||
#lang racket
|
|
||||||
|
|
||||||
(require racket/fixnum)
|
|
||||||
|
|
||||||
(provide interp-R1 interp-exp env-head-value env-head-symbol eval-symbol add-binding)
|
|
||||||
|
|
||||||
(define (interp-R1 env)
|
|
||||||
(lambda (p)
|
|
||||||
(match p
|
|
||||||
[`(program ,data ,exp) ((interp-exp env) exp)])))
|
|
||||||
|
|
||||||
(define (interp-exp env)
|
|
||||||
(lambda (sexp)
|
|
||||||
(match sexp
|
|
||||||
[(? fixnum?) sexp]
|
|
||||||
[(? symbol?) (eval-symbol env sexp)]
|
|
||||||
[`(read) (read-fixnum)]
|
|
||||||
[`(- ,e) (fx- 0 ((interp-exp env) e))]
|
|
||||||
[`(+ ,e1 ,e2) (fx+ ((interp-exp env) e1) ((interp-exp env) e2))]
|
|
||||||
[`(let ([,var ,rexp]) ,body)
|
|
||||||
(let ([value ((interp-exp env) rexp)])
|
|
||||||
((interp-exp (add-binding env (list var value))) body))])))
|
|
||||||
|
|
||||||
(define (read-fixnum)
|
|
||||||
(let ([r (read)])
|
|
||||||
(cond
|
|
||||||
[(fixnum? r) r]
|
|
||||||
[else (error "invalid fixnum in input: " r)])))
|
|
||||||
|
|
||||||
(define (env-head-symbol env)
|
|
||||||
(car (car env)))
|
|
||||||
|
|
||||||
(define (env-head-value env)
|
|
||||||
(cadr (car env)))
|
|
||||||
|
|
||||||
(define (add-binding env binding)
|
|
||||||
(cons binding env))
|
|
||||||
|
|
||||||
(define (eval-symbol env s)
|
|
||||||
(cond
|
|
||||||
[(equal? env `()) (error "Symbol " s " not found")]
|
|
||||||
[(equal? (env-head-symbol env) s) (env-head-value env)]
|
|
||||||
[else (eval-symbol (cdr env) s)]))
|
|
||||||
|
|
@ -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)]))
|
||||||
|
|
@ -1,7 +1 @@
|
||||||
.global main, conclusion
|
|
||||||
main:
|
|
||||||
b start
|
|
||||||
|
|
||||||
conclusion:
|
|
||||||
mov x8, 93 // sys_exit() is at index 93 in kernel functions table
|
|
||||||
svc #0 // generate kernel call sys_exit(123);
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
#lang racket
|
||||||
|
|
||||||
|
(require racket/fixnum)
|
||||||
|
(require racket/dict)
|
||||||
|
|
||||||
|
(provide Int Prim Var Let Program interp-RVar-class interp-RVar)
|
||||||
|
|
||||||
|
(struct Int (value))
|
||||||
|
(struct Var (var))
|
||||||
|
(struct Prim (op args))
|
||||||
|
(struct Let (var expr body))
|
||||||
|
|
||||||
|
(struct Program (info body))
|
||||||
|
|
||||||
|
(define interp-RVar-class
|
||||||
|
(class object%
|
||||||
|
(super-new)
|
||||||
|
|
||||||
|
(define/public ((interp-exp env) exp)
|
||||||
|
(match exp
|
||||||
|
[(Int n) n]
|
||||||
|
[(Var v) (eval-symbol env v)]
|
||||||
|
[(Prim 'read '()) (read-fixnum)]
|
||||||
|
[(Prim '- (list e)) (fx- 0 ((interp-exp env) e))]
|
||||||
|
[(Prim '+ `(,e1 ,e2)) (fx+ ((interp-exp env) e1) ((interp-exp env) e2))]
|
||||||
|
[(Let var rexp body)
|
||||||
|
(let ([value ((interp-exp env) rexp)])
|
||||||
|
((interp-exp (dict-set env var value)) body))]))
|
||||||
|
|
||||||
|
(define/public (interp-program program)
|
||||||
|
(match program
|
||||||
|
[(Program _ body) ((interp-exp (make-immutable-hash)) body)]))))
|
||||||
|
|
||||||
|
(define (read-fixnum)
|
||||||
|
(let ([r (read)])
|
||||||
|
(cond
|
||||||
|
[(fixnum? r) r]
|
||||||
|
[else (error "invalid fixnum in input: " r)])))
|
||||||
|
|
||||||
|
(define (eval-symbol env s)
|
||||||
|
(if (dict-has-key? env s)
|
||||||
|
(dict-ref env s)
|
||||||
|
(error "Symbol " s " not found")))
|
||||||
|
|
||||||
|
(define (interp-RVar program)
|
||||||
|
(send (new interp-RVar-class) interp-program program))
|
||||||
19
test-c2.rkt
19
test-c2.rkt
|
|
@ -1,19 +0,0 @@
|
||||||
#lang racket
|
|
||||||
|
|
||||||
(require "test-util.rkt")
|
|
||||||
(require "c2.rkt")
|
|
||||||
|
|
||||||
(test-eq (env-head-value `((a 1))) 1)
|
|
||||||
(test-eq (env-head-symbol `((a 1))) `a)
|
|
||||||
(test-eq (eval-symbol `((a 1)) `a) 1)
|
|
||||||
(test-eq
|
|
||||||
(let ([env `((a 1) (b 2))])
|
|
||||||
((interp-exp env) `(+ a (- b))))
|
|
||||||
-1)
|
|
||||||
(test-eq
|
|
||||||
((interp-exp `()) `(let ([a (+ 1 2)]) (+ a 3)))
|
|
||||||
6)
|
|
||||||
|
|
||||||
(test-eq
|
|
||||||
((interp-R1 `()) `(program `() (let ([a (+ 1 2)]) (+ a 3))))
|
|
||||||
6)
|
|
||||||
|
|
@ -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))))
|
||||||
|
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
#lang racket
|
||||||
|
|
||||||
|
(require "test-util.rkt")
|
||||||
|
(require "rvar.rkt")
|
||||||
|
|
||||||
|
(define (interp-exp env e)
|
||||||
|
((send (new interp-RVar-class) interp-exp env) e))
|
||||||
|
|
||||||
|
(test-eq
|
||||||
|
(let ([env `((a . 1) (b . 2))])
|
||||||
|
(interp-exp env (Var 'a)))
|
||||||
|
1)
|
||||||
|
|
||||||
|
(test-eq
|
||||||
|
(let ([env `((a . 1) (b . 2))])
|
||||||
|
(interp-exp env (Prim '+ (list (Var 'a) (Int 3)))))
|
||||||
|
4)
|
||||||
|
|
||||||
|
(test-eq
|
||||||
|
(let ([env `((a . 1) (b . 2))])
|
||||||
|
(interp-exp env (Prim '- `(,(Int 3)))))
|
||||||
|
-3)
|
||||||
|
|
||||||
|
(test-eq
|
||||||
|
(let ([env `((a . 1) (b . 2))])
|
||||||
|
(interp-exp env (Prim '+ (list (Var 'a) (Prim `- (list (Var 'b)))))))
|
||||||
|
-1)
|
||||||
|
|
||||||
|
(test-eq
|
||||||
|
(interp-exp `() (Let 'a
|
||||||
|
(Prim '+ (list (Int 1) (Int 2)))
|
||||||
|
(Prim '+ (list (Var 'a) (Int 3)))))
|
||||||
|
6)
|
||||||
|
|
||||||
|
(test-eq
|
||||||
|
(interp-RVar (Program `() (Let 'a
|
||||||
|
(Prim '+ (list (Int 1) (Int 2)))
|
||||||
|
(Prim '+ (list (Var 'a) (Int 3))))))
|
||||||
|
6)
|
||||||
|
|
@ -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