Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 5.30 KB | None | 0 0
  1. ;  JAMES YU
  2. ;     +
  3. ; FRANK LIU
  4. ;
  5. ;      :)
  6.  
  7. #lang racket
  8.  
  9. (struct psymbol (type val) #:mutable)
  10.  
  11. (define (primp-assemble prog)
  12.   ; LINE COUNTER
  13.   (define lc 0)
  14.   ; BINDINGS
  15.   (define heap (make-hash))
  16.   (define (add-to-heap k v)
  17.     (cond [(hash-has-key? heap k) (error "duplicate")]
  18.           [else (hash-set! heap k v)]))
  19.   (define (lookup key)
  20.     (hash-ref heap key (lambda () (error "undefined"))))
  21.   ; FIRST PASS, GET VARIABLE NAMES
  22.   (define (get-vars p)
  23.     (if (empty? p)
  24.         empty
  25.         (match (first p)
  26.           ; HALT
  27.           [`(halt) (set! lc (add1 lc))
  28.                    (cons 0 (get-vars (rest p)))]
  29.           ; CONST
  30.           [`(const ,psym ,val) (add-to-heap psym (psymbol `imm val))
  31.                                (get-vars (rest p))]
  32.           ; DATA
  33.           [`(data ,psym (,n ,val)) (add-to-heap psym (psymbol `ind lc))
  34.                                    (set! lc (+ n lc))
  35.                                    (append (for/list ([i n])
  36.                                              `(lit ,val))
  37.                                            (get-vars (rest p)))]
  38.           [`(data ,psym ,val ...) (add-to-heap psym (psymbol `ind lc))
  39.                                   (append (for/list ([i val])
  40.                                             (set! lc (add1 lc))
  41.                                             `(lit ,i))
  42.                                           (get-vars (rest p)))]
  43.           ; LABEL
  44.           [`(label ,psym) (add-to-heap psym (psymbol `tgt lc))
  45.                           (get-vars (rest p))]
  46.           ; REGULAR PRIMP
  47.           [x (set! lc (add1 lc))
  48.              (cons x (get-vars (rest p)))])))
  49.  
  50.   ; EXECUTE PASS 1
  51.   (set! prog (get-vars prog))
  52.   ; RESOLVE NAMES
  53.   (define (dfs-resolve k)
  54.     (define l (lookup k))
  55.     (cond [(symbol? (psymbol-val l)) (define v (psymbol-val l))
  56.                                      (set-psymbol-val! l empty) ; placeholder value
  57.                                      (set-psymbol-val! l (dfs-resolve v))
  58.                                      (if (empty? (psymbol-val l))
  59.                                          (error "circular")
  60.                                          (void))]
  61.           [else (psymbol-val l)]))
  62.   (for ([(key value) heap])
  63.     (dfs-resolve key))
  64.   ; TEST PRINT
  65.   ;(for ([(key value) heap])
  66.   ;å  (printf "~a:(~a,~a)\n" key (psymbol-type value) (psymbol-val value)))
  67.  
  68.   ; TYPE CHECKERS
  69.   (define (get-lit lit)
  70.     (cond [(number? lit) lit]
  71.           [(boolean? lit) lit]
  72.           [else (psymbol-val (lookup lit))]))
  73.   (define (get-tgt tgt)
  74.     (cond [(number? tgt) tgt]
  75.           [(symbol? tgt) (define l (lookup tgt))
  76.                          (if (symbol=? (psymbol-type l) `tgt)
  77.                              (psymbol-val l)
  78.                              `(,(psymbol-val l)))]
  79.           [else (get-opd tgt)]
  80.           ))
  81.   (define (get-opd opd)
  82.     (match opd
  83.       [(? number? x) x]
  84.       [(? boolean? x) x]
  85.       [`(,imm ,ind) `(,(cond [(number? imm) imm]
  86.                              [else (define l (lookup imm))
  87.                                    (if (symbol=? (psymbol-type l) `tgt)
  88.                                        (error "incorrect")
  89.                                        (psymbol-val l))])
  90.                       ,(match ind
  91.                          [`(,x) (if (number? x)
  92.                                     ind
  93.                                     (error "incorrect"))]
  94.                          [x (define l (lookup x))
  95.                             (if (symbol=? (psymbol-type l) `ind)
  96.                                 `(,(psymbol-val l))
  97.                                 (error "incorrect"))]))]
  98.       [`(,imm) (if (number? imm)
  99.                  opd
  100.                  (error "incorrect"))]
  101.       [x (define l (lookup x))
  102.          (cond [(symbol=? (psymbol-type l) `imm) (psymbol-val l)]
  103.                [(symbol=? (psymbol-type l) `ind) `(,(psymbol-val l))]
  104.                [else (error "incorrect")])]))
  105.   (define (get-dest dest)
  106.     (cond [(list? dest) (get-opd dest)]
  107.           [else (define l (lookup dest))
  108.                 (if (or (symbol=? (psymbol-type l) `imm)
  109.                         (symbol=? (psymbol-type l) `tgt))
  110.                     (error "incorrect")
  111.                     `(,(psymbol-val l)))]))
  112.   ; SUBSTITUTION
  113.   (define (subst p)
  114.     (cond [(empty? p) empty]
  115.           [else (match (first p)
  116.                   [`(lit ,sym) (cons (get-lit sym)
  117.                                      (subst (rest p)))]
  118.                   [`(jump ,tgt) (cons `(jump ,(get-tgt tgt))
  119.                                       (subst (rest p)))]
  120.                   [`(print-val ,opd) (cons `(print-val ,(get-opd opd))
  121.                                            (subst (rest p)))]
  122.                   [`(branch ,opd ,tgt) (cons `(branch ,(get-opd opd) ,(get-tgt tgt))
  123.                                              (subst (rest p)))]
  124.                   [`(,bin ,dest ,opd) (cons `(,bin ,(get-dest dest) ,(get-opd opd))
  125.                                             (subst (rest p)))]
  126.                   [`(,tern ,dest ,opd1 ,opd2) (cons `(,tern ,(get-dest dest) ,(get-opd opd1) ,(get-opd opd2))
  127.                                             (subst (rest p)))]
  128.                   [(? symbol? x) (error "incorrect")]
  129.                   [x (cons x (subst (rest p)))])]))
  130.   (set! prog (subst prog))
  131.   prog)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement