Skip to content

Commit 049889d

Browse files
committed
Con and Dupe files.
1 parent df7fe03 commit 049889d

30 files changed

Lines changed: 473 additions & 3 deletions

langs/con/ast.rkt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#lang racket
2+
(provide Lit Prim1 IfZero)
3+
4+
;; type Expr = (Lit Integer)
5+
;; | (Prim1 Op1 Expr)
6+
;; | (IfZero Expr Expr Expr)
7+
8+
;; type Op1 = 'add1 | 'sub1
9+
10+
(struct Lit (i) #:prefab)
11+
(struct Prim1 (p e) #:prefab)
12+
(struct IfZero (e1 e2 e3) #:prefab)
13+

langs/con/compile-ops.rkt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#lang racket
2+
(provide compile-op1)
3+
(require "ast.rkt")
4+
(require a86/ast)
5+
6+
(define rax 'rax)
7+
8+
;; Op1 -> Asm
9+
(define (compile-op1 p)
10+
(match p
11+
['add1 (Add rax 1)]
12+
['sub1 (Sub rax 1)]))
13+

langs/con/compile-stdin.rkt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#lang racket
2+
(provide main)
3+
(require "parse.rkt")
4+
(require "compile.rkt")
5+
(require a86/printer)
6+
7+
;; -> Void
8+
;; Compile contents of stdin,
9+
;; emit asm code on stdout
10+
(define (main)
11+
(read-line) ; ignore #lang racket line
12+
(asm-display (compile (parse (read)))))
13+

langs/con/compile.rkt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#lang racket
2+
(provide (all-defined-out))
3+
(require "ast.rkt")
4+
(require "compile-ops.rkt")
5+
(require a86/ast)
6+
7+
(define rax 'rax)
8+
;; Expr -> Asm
9+
(define (compile e)
10+
(prog (Global 'entry)
11+
(Label 'entry)
12+
(compile-e e)
13+
(Ret)))
14+
15+
;; Expr -> Asm
16+
(define (compile-e e)
17+
(match e
18+
[(Lit i) (seq (Mov rax i))]
19+
[(Prim1 p e) (compile-prim1 p e)]
20+
[(IfZero e1 e2 e3)
21+
(compile-ifzero e1 e2 e3)]))
22+
23+
;; Op1 Expr -> Asm
24+
(define (compile-prim1 p e)
25+
(seq (compile-e e)
26+
(compile-op1 p)))
27+
28+
;; Expr Expr Expr -> Asm
29+
(define (compile-ifzero e1 e2 e3)
30+
(let ((l1 (gensym 'ifz))
31+
(l2 (gensym 'ifz)))
32+
(seq (compile-e e1)
33+
(Cmp rax 0)
34+
(Jne l1)
35+
(compile-e e2)
36+
(Jmp l2)
37+
(Label l1)
38+
(compile-e e3)
39+
(Label l2))))

langs/con/interp-prim.rkt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#lang racket
2+
(provide interp-prim1)
3+
4+
;; Op1 Integer -> Integer
5+
(define (interp-prim1 op i)
6+
(match op
7+
['add1 (add1 i)]
8+
['sub1 (sub1 i)]))
9+

langs/con/interp-stdin.rkt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#lang racket
2+
(provide main)
3+
(require "parse.rkt")
4+
(require "interp.rkt")
5+
6+
;; -> Void
7+
;; Parse and interpret contents of stdin,
8+
;; print result on stdout
9+
(define (main)
10+
(read-line) ; ignore #lang racket line
11+
(println (interp (parse (read)))))
12+

langs/con/interp.rkt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#lang racket
2+
(provide interp)
3+
(require "ast.rkt")
4+
(require "interp-prim.rkt")
5+
6+
;; Expr -> Integer
7+
(define (interp e)
8+
(match e
9+
[(Lit i) i]
10+
[(Prim1 p e) (interp-prim1 p (interp e))]
11+
[(IfZero e1 e2 e3)
12+
(if (zero? (interp e1))
13+
(interp e2)
14+
(interp e3))]))
15+
16+

langs/con/main.rkt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#lang racket
2+
(require "ast.rkt")
3+
(require "parse.rkt")
4+
(require "interp.rkt")
5+
(require "compile.rkt")
6+
(require "run.rkt")
7+
(provide (all-from-out "ast.rkt"))
8+
(provide (all-from-out "parse.rkt"))
9+
(provide (all-from-out "interp.rkt"))
10+
(provide (all-from-out "compile.rkt"))
11+
(provide (all-from-out "run.rkt"))
12+
13+

langs/con/parse.rkt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#lang racket
2+
(provide parse)
3+
(require "ast.rkt")
4+
5+
;; S-Expr -> Expr
6+
(define (parse s)
7+
(match s
8+
[(? exact-integer?) (Lit s)]
9+
[(list (? op1? o) e) (Prim1 o (parse e))]
10+
;; NEW:
11+
[(list 'if (list 'zero? e1) e2 e3)
12+
(IfZero (parse e1) (parse e2) (parse e3))]
13+
[_ (error "Parse error")]))
14+
15+
(define (op1? x)
16+
(memq x '(add1 sub1)))
17+

langs/con/run-stdin.rkt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#lang racket
2+
(provide main)
3+
(require "parse.rkt")
4+
(require "compile.rkt")
5+
(require "run.rkt")
6+
7+
;; -> Void
8+
;; Compile contents of stdin and use asm-interp to run
9+
(define (main)
10+
(read-line) ; ignore #lang racket line
11+
(run (compile (parse (read)))))
12+

0 commit comments

Comments
 (0)