Skip to content

Commit 9624606

Browse files
committed
QuickChick testing for dupe
1 parent e34da34 commit 9624606

24 files changed

+1193
-0
lines changed

langs/dupe-qc/Makefile

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
UNAME := $(shell uname)
2+
.PHONY: test
3+
4+
ifeq ($(UNAME), Darwin)
5+
format=macho64
6+
else
7+
format=elf64
8+
endif
9+
10+
%.run: %.o main.o
11+
gcc main.o $< -o $@
12+
13+
main.o: main.c types.h
14+
gcc -c main.c -o main.o
15+
16+
%.o: %.s
17+
nasm -f $(format) -o $@ $<
18+
19+
%.s: %.rkt
20+
racket -t compile-file.rkt -m $< > $@
21+
22+
clean:
23+
rm *.o *.s *.run
24+
25+
test: example.run
26+
@test "$(shell ./example.run)" = "$(shell racket example.rkt)"

langs/dupe-qc/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 Int Bool Prim1 If)
3+
4+
;; type Expr =
5+
;; | (Int Integer)
6+
;; | (Bool Boolean)
7+
;; | (Prim1 Op Expr)
8+
;; | (If Expr Expr Expr)
9+
;; type Op = 'add1 | 'sub1 | 'zero?
10+
(struct Int (i) #:prefab)
11+
(struct Bool (b) #:prefab)
12+
(struct Prim1 (p e) #:prefab)
13+
(struct If (e1 e2 e3) #:prefab)

langs/dupe-qc/compile-file.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" "compile.rkt" a86/printer)
4+
5+
;; String -> Void
6+
;; Compile contents of given file name,
7+
;; emit asm code on stdout
8+
(define (main fn)
9+
(let ((p (open-input-file fn)))
10+
(begin
11+
(read-line p) ; ignore #lang racket line
12+
(displayln (asm-string (compile (parse (read p)))))
13+
(close-input-port p))))

langs/dupe-qc/compile.rkt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#lang racket
2+
(provide (all-defined-out))
3+
(require "ast.rkt" "types.rkt" a86/ast)
4+
5+
;; Expr -> Asm
6+
(define (compile e)
7+
(prog (Label 'entry)
8+
(compile-e e)
9+
(Ret)))
10+
11+
;; Expr -> Asm
12+
(define (compile-e e)
13+
(match e
14+
[(Int i) (compile-integer i)]
15+
[(Bool b) (compile-boolean b)]
16+
[(Prim1 p e) (compile-prim p e)]
17+
[(If e1 e2 e3) (compile-if e1 e2 e3)]))
18+
19+
;; Integer -> Asm
20+
(define (compile-integer i)
21+
(seq (Mov 'rax (value->bits i))))
22+
23+
;; Boolean -> Asm
24+
(define (compile-boolean b)
25+
(seq (Mov 'rax (value->bits b))))
26+
27+
;; Op Expr -> Asm
28+
(define (compile-prim p e)
29+
(seq (compile-e e)
30+
(match p
31+
['add1 (Add 'rax (value->bits 1))]
32+
['sub1 (Sub 'rax (value->bits 1))]
33+
['zero?
34+
(let ((l1 (gensym 'nzero)))
35+
(seq (Cmp 'rax 0)
36+
(Mov 'rax val-true)
37+
(Je l1)
38+
(Mov 'rax val-false)
39+
(Label l1)))])))
40+
41+
;; Expr Expr Expr -> Asm
42+
(define (compile-if e1 e2 e3)
43+
(let ((l1 (gensym 'if))
44+
(l2 (gensym 'if)))
45+
(seq (compile-e e1)
46+
(Cmp 'rax val-false)
47+
(Je l1)
48+
(compile-e e2)
49+
(Jmp l2)
50+
(Label l1)
51+
(compile-e e3)
52+
(Label l2))))

langs/dupe-qc/compile/help.rkt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#lang racket
2+
(provide (all-defined-out))
3+
4+
;; -> [List Label Label]
5+
;; Guaranteed to be unique on each call
6+
(define gen-if-labels
7+
(let ((i 0))
8+
(λ ()
9+
(set! i (add1 i))
10+
(list (lab "f" i)
11+
(lab "x" i)))))
12+
13+
;; String Integer -> Symbol
14+
(define (lab s i)
15+
(string->symbol (string-append "if_" s "_" (number->string i))))

langs/dupe-qc/correct.rkt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#lang racket
2+
(provide (all-defined-out))
3+
(require rackunit
4+
"interp.rkt"
5+
"compile.rkt"
6+
"types.rkt"
7+
a86/interp)
8+
9+
(define (check-correctness e)
10+
(with-handlers ([exn:fail? void])
11+
(check-eqv? (interp e)
12+
(bits->value (asm-interp (compile e))))))
Lines changed: 103 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)