Advertisement
Guest User

Untitled

a guest
Feb 1st, 2015
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.96 KB | None | 0 0
  1. (library (Compiler verify-scheme)
  2. (export verify-scheme)
  3. (import (chezscheme)
  4. (Framework helpers)
  5. (Framework match))
  6.  
  7. ;; Verify that the program is valid. We try to catch as many errors
  8. ;; as possible in this pass, so that we do not encounter errors from
  9. ;; the middle of the compiler.
  10.  
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12. ;; Assignment 3 updates ;;
  13. ;; ;;
  14. ;; implementing env-passing-logic from a2sol for Body ;;
  15. ;; ;;
  16. ;; Still need :: Bools and other values (and debugging) ;;
  17. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  18.  
  19. (define-who verify-scheme
  20. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  21. ;; Environment checkers
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23. (define verify-label-list
  24. (lambda (label*)
  25. (let loop ([label* label*] [idx* '()])
  26. (unless (null? label*)
  27. (let ([label (car label*)] [label* (cdr label*)])
  28. (unless (label? label)
  29. (error who "invalid label ~s found" label))
  30. (let ([idx (extract-suffix label)])
  31. (when (member idx idx*)
  32. (error who "non-unique label suffix ~s found" idx))
  33. (loop label* (cons idx idx*))))))))
  34. (define verify-uvar-list
  35. (lambda (uvar*)
  36. (let loop ([uvar* uvar*] [idx* '()])
  37. (unless (null? uvar*)
  38. (let ([uvar (car uvar*)] [uvar* (cdr uvar*)])
  39. (unless (uvar? uvar)
  40. (error who "invalid uvar ~s found" uvar))
  41. (let ([idx (extract-suffix uvar)])
  42. (when (member idx idx*)
  43. (error who "non-unique uvar suffix ~s found" idx))
  44. (loop uvar* (cons idx idx*))))))))
  45. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  46. ;; SIDE-effects and Predicates
  47. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  48. (define Var
  49. (lambda (var)
  50. (unless (or (register? var) (frame-var? var) (uvar? var))
  51. (error who "invalid variable ~s" var))
  52. var)) ;; this returns var because of Effect logic
  53.  
  54. (define Loc
  55. (lambda (l)
  56. (unless (or (register? l) (frame-var? l))
  57. (error who "invalid location variable ~s" l))))
  58.  
  59. (define verify-binds
  60. (lambda (binds)
  61. (match binds
  62. (((,uvar* ,[Loc -> loc*]) ...)
  63. (verify-uvar-list uvar*))
  64. (,x (error who "invalid uvar binding ~s" x)))))
  65.  
  66. (define Bool?
  67. (lambda (b)
  68. (or (eqv? b 'true)
  69. (eqv? b 'false))))
  70.  
  71. (define Relop
  72. (lambda (r)
  73. (memq r (list '< '<= '= '>= '> '=))))
  74. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  75. ;; BNF constructs
  76. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  77. (define Body
  78. (lambda (label*)
  79. (lambda (body)
  80. (match body
  81. ((locate (,ubinds* ...) ,tail)
  82. (verify-binds ubinds*)
  83. ((Tail label* ubinds*) tail))
  84. (,x (error who "invalid body ~s" x))))))
  85.  
  86. (define Tail
  87. (lambda (label* ubinds*)
  88. (lambda (tail)
  89. (match tail
  90. ((begin ,[(Effect label* ubinds*) -> ef*] ... ,tail) ((Tail label* ubinds*) tail))
  91. ((if ,pred ,[tail1] ,[tail2])
  92. ((Pred label* ubinds*) pred))
  93. ((,[(Triv label* ubinds*) -> t])
  94. (when (integer? t)
  95. (error who "~s violates machine constraints" `(,t))))
  96. (,tail (error who "invalid Tail ~s" tail))))))
  97.  
  98. (define Pred
  99. (lambda (label* ubinds*)
  100. (lambda (pred)
  101. (match pred
  102. ((,bool) (unless (Bool? bool) (error who "invalid boolean variable ~s" bool)))
  103. ((,r ,[(Triv label* ubinds*) -> triv1] ,[(Triv label* ubinds*) -> triv2])
  104. (unless (and (Relop r)
  105. (or (and (register? triv1)
  106. (or (register? triv2)
  107. (frame-var? triv2)
  108. (int32? triv2)
  109. (label? triv2)))
  110. (and (frame-var? triv1)
  111. (or (register? triv2)
  112. (int32? triv2)))))
  113. (error who "invalid relational expression ~s" r)))
  114. ((if ,[p1] ,[p2] ,p3)
  115. ((Pred label* ubinds*) p3))
  116. ((begin ,ef* ... ,[p])
  117. (for-each (Effect label* ubinds*) ef*))
  118. (,pred (error who "invalid Pred ~s" pred))))))
  119.  
  120. (define Effect
  121. (lambda (label* ubinds*)
  122. (lambda (ef)
  123. (match ef
  124. ((set! ,[(Triv label* ubinds*) -> x]
  125. (,binop ,[(Triv label* ubinds*) -> y] ,[(Triv label* ubinds*) -> z]))
  126. (unless (and (eq? y x)
  127. (case binop
  128. [(+ - logand logor)
  129. (or (and (register? x)
  130. (or (register? z)
  131. (frame-var? z)
  132. (int32? z)))
  133. (and (frame-var? x)
  134. (or (register? z)
  135. (int32? z))))]
  136. [(*)
  137. (and (register? x)
  138. (or (register? z)
  139. (frame-var? z)
  140. (int32? z)))]
  141. [(sra)
  142. (and (or (register? x) (frame-var? x))
  143. (uint6? z))]
  144. [else (error who "invalid binary operator ~s" binop)]))
  145. (error who "~s violates machine constraints" `(set! ,x (,binop ,y ,z)))))
  146. ((set! ,[(Triv label* ubinds*) -> x] ,[(Triv label* ubinds*) -> y])
  147. (unless (or (and (register? x)
  148. (or (register? y)
  149. (frame-var? y)
  150. (int64? y)
  151. (label? y)))
  152. (and (frame-var? x)
  153. (or (register? y)
  154. (int32? y))))
  155. (error who "~s violates machine constraints" `(set! ,x ,y))))
  156. ((nop) #t)
  157. ((if ,pred ,[e1] ,[e2])
  158. ((Pred label* ubinds*) pred))
  159. ((begin ,[ef*] ... ,ef)
  160. ((Effect label* ubinds*) ef))
  161. (,ef (error who "invalid Effect ~s" ef))))))
  162.  
  163. (define Triv
  164. (lambda (label* ubinds*)
  165. (lambda (t)
  166. (unless (or (register? t) (frame-var? t) (label? t) (uvar? t)
  167. (and (integer? t) (exact? t)))
  168. (error who "invalid Triv ~s" t))
  169. (when (or (label? t) (uvar? t))
  170. (if (label? t)
  171. (unless (memq t label*)
  172. (error who "unbound label ~s" t))
  173. (unless (assq t ubinds*)
  174. (error who "unbound uvar ~s" t))))
  175. (if (uvar? t)
  176. (cadr (assv t ubinds*))
  177. t))))
  178.  
  179. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  180. ;; primary
  181. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  182. (lambda (x)
  183. (match x
  184. ((letrec ((,label* (lambda () ,body*)) ...) ,body)
  185. (verify-label-list label*)
  186. (for-each (Body label*) body*)
  187. ((Body label*) body))
  188. [,x (error who "invalid Program. Expected letrec ~s" x)])
  189. x))
  190. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement