/input.rkt

https://bitbucket.org/geoffhill/lc-compiler · Racket · 185 lines · 142 code · 25 blank · 18 comment · 0 complexity · 07ebb46089afc84933dee74226be4c2b MD5 · raw file

  1. #lang plai
  2. ;;; EECS 322 L Compiler PLAI Input (Code Parsing)
  3. ;;; Geoff Hill <GeoffreyHill2012@u.northwestern.edu>
  4. ;;; Spring 2011
  5. (require (file "preds.rkt"))
  6. (require (file "utils.rkt"))
  7. (require (file "types.rkt"))
  8. ;;;
  9. ;;; S-EXPR -> L1
  10. ;;;
  11. (define-with-contract (build-L1prog src)
  12. (list? . -> . L1prog?)
  13. (l1prog (build-l1mainfn (car src))
  14. (map build-l1fn (cdr src))))
  15. (define-with-contract (build-l1mainfn src)
  16. (any/c . -> . l1mainfn?)
  17. (l1mainfn (map build-L1stmt src)))
  18. (define-with-contract (build-l1fn src)
  19. (any/c . -> . l1fn?)
  20. (match src
  21. [`(,(? label? lbl) ,stmts ...)
  22. (l1fn lbl (map build-L1stmt stmts))]
  23. [_ (error 'L1 "not a well-formed function")]))
  24. (define-with-contract (build-L1stmt src)
  25. (any/c . -> . L1stmt?)
  26. (match src
  27. [`(,(? L1-x? lhs) <- ,(? L1-s? rhs)) (l1s-assign lhs rhs)]
  28. [`(,(? L1-x? lhs) <- (mem ,(? L1-x? base) ,(? n4? offset))) (l1s-memget lhs base offset)]
  29. [`((mem ,(? L1-x? base) ,(? n4? offset)) <- ,(? L1-s? rhs)) (l1s-memset base offset rhs)]
  30. [`(,(? L1-x? lhs) ,(? aop? op) ,(? L1-s? rhs)) (l1s-aop lhs op rhs)]
  31. [`(,(? L1-x? lhs) ,(? sop? op) ,(? L1-s? rhs)) (l1s-sop lhs op rhs)]
  32. [`(,(? L1-x? lhs) <- ,(? L1-s? c1) ,(? cmp? op) ,(? L1-s? c2)) (l1s-cmp lhs c1 op c2)]
  33. [(? label? lbl) (l1s-label lbl)]
  34. [`(goto ,(? label? lbl)) (l1s-goto lbl)]
  35. [`(cjump ,(? L1-s? c1) ,(? cmp? op) ,(? L1-s? c2) ,(? label? lbl1) ,(? label? lbl2))
  36. (l1s-cjump c1 op c2 lbl1 lbl2)]
  37. [`(call ,(? L1-s? dst)) (l1s-call dst)]
  38. [`(tail-call ,(? L1-s? dst)) (l1s-tcall dst)]
  39. [`(return) (l1s-return)]
  40. [`(,(? L1-x? lhs) <- (print ,(? L1-s? arg1))) (l1s-print lhs arg1)]
  41. [`(,(? L1-x? lhs) <- (allocate ,(? L1-s? arg1) ,(? L1-s? arg2))) (l1s-alloc lhs arg1 arg2)]
  42. [`(,(? L1-x? lhs) <- (array-error ,(? L1-s? arg1) ,(? L1-s? arg2))) (l1s-arrayerr lhs arg1 arg2)]
  43. [_ (error 'L1 "no matching clause for ~a" src)]))
  44. ;;;
  45. ;;; S-EXPR -> L2
  46. ;;;
  47. (define-with-contract (build-L2prog src)
  48. (list? . -> . L2prog?)
  49. (l2prog (build-l2mainfn (car src))
  50. (map build-l2fn (cdr src))))
  51. (define-with-contract (build-l2mainfn src)
  52. (any/c . -> . l2mainfn?)
  53. (l2mainfn (map build-L2stmt src)))
  54. (define-with-contract (build-l2fn src)
  55. (any/c . -> . l2fn?)
  56. (match src
  57. [`(,(? label? lbl) ,stmts ...)
  58. (l2fn lbl (map build-L2stmt stmts))]
  59. [_ (error 'L2 "not a well-formed function")]))
  60. (define-with-contract (build-L2stmt src)
  61. (any/c . -> . L2stmt?)
  62. (match src
  63. [`(,(? L2-x? lhs) <- ,(? L2-s? rhs)) (l2s-assign lhs rhs)]
  64. [`(,(? L2-x? lhs) <- (mem ,(? L2-x? base) ,(? n4? offset))) (l2s-memget lhs base offset)]
  65. [`((mem ,(? L2-x? base) ,(? n4? offset)) <- ,(? L2-s? rhs)) (l2s-memset base offset rhs)]
  66. [`(,(? L2-x? lhs) ,(? aop? op) ,(? L2-s? rhs)) (l2s-aop lhs op rhs)]
  67. [`(,(? L2-x? lhs) ,(? sop? op) ,(? L2-s? rhs)) (l2s-sop lhs op rhs)]
  68. [`(,(? L2-x? lhs) <- ,(? L2-s? c1) ,(? cmp? op) ,(? L2-s? c2)) (l2s-cmp lhs c1 op c2)]
  69. [(? label? lbl) (l2s-label lbl)]
  70. [`(goto ,(? label? lbl)) (l2s-goto lbl)]
  71. [`(cjump ,(? L2-s? c1) ,(? cmp? op) ,(? L2-s? c2) ,(? label? lbl1) ,(? label? lbl2))
  72. (l2s-cjump c1 op c2 lbl1 lbl2)]
  73. [`(call ,(? L2-s? dst)) (l2s-call dst)]
  74. [`(tail-call ,(? L2-s? dst)) (l2s-tcall dst)]
  75. [`(return) (l2s-return)]
  76. [`(,(? L2-x? lhs) <- (print ,(? L2-s? arg1))) (l2s-print lhs arg1)]
  77. [`(,(? L2-x? lhs) <- (allocate ,(? L2-s? arg1) ,(? L2-s? arg2))) (l2s-alloc lhs arg1 arg2)]
  78. [`(,(? L2-x? lhs) <- (array-error ,(? L2-s? arg1) ,(? L2-s? arg2))) (l2s-arrayerr lhs arg1 arg2)]
  79. [_ (error 'L2 "no matching clause for ~a" src)]))
  80. ;;;
  81. ;;; S-EXPR -> L3
  82. ;;;
  83. (define-with-contract (build-L3prog src)
  84. (list? . -> . L3prog?)
  85. (l3prog (build-l3mainfn (car src))
  86. (map build-l3fn (cdr src))))
  87. (define-with-contract (build-l3mainfn src)
  88. (any/c . -> . l3mainfn?)
  89. (l3mainfn (build-L3expr src)))
  90. (define-with-contract (build-l3fn src)
  91. (any/c . -> . l3fn?)
  92. (match src
  93. [`(,(? label? lbl) (,(? L3-x? args) ...) ,e)
  94. (l3fn lbl args (build-L3expr e))]
  95. [_ (error 'L3 "not a well-formed function")]))
  96. (define-with-contract (build-L3expr src)
  97. (any/c . -> . L3expr?)
  98. (match src
  99. [`(let ([,(? L3-x? id) ,t]) ,e) (l3e-let id (build-L3term t) (build-L3expr e))]
  100. [`(if ,(? L3-v? v) ,e1 ,e2) (l3e-if v (build-L3expr e1) (build-L3expr e2))]
  101. [_ (l3e-t (build-L3term src))]))
  102. (define-with-contract (build-L3term src)
  103. (any/c . -> . L3term?)
  104. (match src
  105. [`(,(? L3-biop? op) ,(? L3-v? v1) ,(? L3-v? v2)) (l3t-biop op v1 v2)]
  106. [`(,(? L3-pred? pred) ,(? L3-v? v)) (l3t-pred pred v)]
  107. [`(,(? L3-v? fn) ,(? L3-v? args) ...) (l3t-apply fn args)]
  108. [`(new-array ,(? L3-v? len) ,(? L3-v? init)) (l3t-newarray len init)]
  109. [`(new-tuple ,(? L3-v? args) ...) (l3t-newtuple args)]
  110. [`(aref ,(? L3-v? arr) ,(? L3-v? i)) (l3t-aref arr i)]
  111. [`(aset ,(? L3-v? arr) ,(? L3-v? i) ,(? L3-v? v)) (l3t-aset arr i v)]
  112. [`(alen ,(? L3-v? arr)) (l3t-alen arr)]
  113. [`(print ,(? L3-v? v)) (l3t-print v)]
  114. [`(make-closure ,(? label? proc) ,(? L3-v? vars)) (l3t-makeclj proc vars)]
  115. [`(closure-proc ,(? L3-v? clj)) (l3t-cljproc clj)]
  116. [`(closure-vars ,(? L3-v? clj)) (l3t-cljvars clj)]
  117. [(? L3-v? v) (l3t-v v)]
  118. [_ (error 'L3 "no matching term for ~a" src)]))
  119. ;;;
  120. ;;; S-EXPR -> L4
  121. ;;;
  122. (define-with-contract (build-L4prog src)
  123. (list? . -> . L4prog?)
  124. (l4prog (build-l4mainfn (car src))
  125. (map build-l4fn (cdr src))))
  126. (define-with-contract (build-l4mainfn src)
  127. (any/c . -> . l4mainfn?)
  128. (l4mainfn (build-L4expr src)))
  129. (define-with-contract (build-l4fn src)
  130. (any/c . -> . l4fn?)
  131. (match src
  132. [`(,(? label? lbl) (,(? L4-x? args) ...) ,e)
  133. (l4fn lbl args (build-L4expr e))]
  134. [_ (error 'L4 "not a well-formed function")]))
  135. (define-with-contract (build-L4expr src)
  136. (any/c . -> . L4expr?)
  137. (match src
  138. [`(let ([,(? L4-x? id) ,e1]) ,e2) (l4e-let id (build-L4expr e1) (build-L4expr e2))]
  139. [`(if ,e1 ,e2 ,e3) (l4e-if (build-L4expr e1) (build-L4expr e2) (build-L4expr e3))]
  140. [`(begin ,e1 ,e2) (l4e-begin (build-L4expr e1) (build-L4expr e2))]
  141. [`(,fn ,args ...) (l4e-app (build-L4expr fn) (map build-L4expr args))]
  142. [(? L4-v?) (l4e-v src)]
  143. [_ (error 'L4 "not a well-formed expression")]))
  144. ;;;
  145. ;;; S-EXPR -> L5
  146. ;;;
  147. (define-with-contract (build-L5expr src)
  148. (any/c . -> . L5expr?)
  149. (match src
  150. [`(lambda (,args ...) ,e) (l5e-lambda args (build-L5expr e))]
  151. [`(let ([,(? L5-var? id) ,e1]) ,e2) (l5e-let id (build-L5expr e1) (build-L5expr e2))]
  152. [`(letrec ([,(? L5-var? id) ,e1]) ,e2) (l5e-letrec id (build-L5expr e1) (build-L5expr e2))]
  153. [`(if ,e1 ,e2 ,e3) (l5e-if (build-L5expr e1) (build-L5expr e2) (build-L5expr e3))]
  154. [`(new-tuple ,args ...) (l5e-newtuple (map build-L5expr args))]
  155. [`(begin ,e1 ,e2) (l5e-begin (build-L5expr e1) (build-L5expr e2))]
  156. [`(,fn ,args ...) (l5e-app (build-L5expr fn) (map build-L5expr args))]
  157. [(? L5-builtin? prim) (l5e-prim prim)]
  158. [(? L5-var? var) (l5e-var var)]
  159. [(? num? num) (l5e-num num)]
  160. [_ (error 'L5 "not a well-formed expression")]))