Advertisement
Guest User

Untitled

a guest
Dec 16th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.99 KB | None | 0 0
  1. (* tag-parser.ml
  2. * A compiler from Scheme to CISC
  3. *
  4. * Programmer: Mayer Goldberg, 2018
  5. *)
  6.  
  7. #use "tag-parser.ml";;
  8.  
  9. type var =
  10. | VarFree of string
  11. | VarParam of string * int
  12. | VarBound of string * int * int;;
  13.  
  14. type expr' =
  15. | Const' of constant
  16. | Var' of var
  17. | Box' of var
  18. | BoxGet' of var
  19. | BoxSet' of var * expr'
  20. | If' of expr' * expr' * expr'
  21. | Seq' of expr' list
  22. | Set' of expr' * expr'
  23. | Def' of expr' * expr'
  24. | Or' of expr' list
  25. | LambdaSimple' of string list * expr'
  26. | LambdaOpt' of string list * string * expr'
  27. | Applic' of expr' * (expr' list)
  28. | ApplicTP' of expr' * (expr' list);;
  29.  
  30. let rec expr'_eq e1 e2 =
  31. match e1, e2 with
  32. | Const' Void, Const' Void -> true
  33. | Const'(Sexpr s1), Const'(Sexpr s2) -> sexpr_eq s1 s2
  34. | Var'(VarFree v1), Var'(VarFree v2) -> String.equal v1 v2
  35. | Var'(VarParam (v1,mn1)), Var'(VarParam (v2,mn2)) -> String.equal v1 v2 && mn1 = mn2
  36. | Var'(VarBound (v1,mj1,mn1)), Var'(VarBound (v2,mj2,mn2)) -> String.equal v1 v2 && mj1 = mj2 && mn1 = mn2
  37. | If'(t1, th1, el1), If'(t2, th2, el2) -> (expr'_eq t1 t2) &&
  38. (expr'_eq th1 th2) &&
  39. (expr'_eq el1 el2)
  40. | (Seq'(l1), Seq'(l2)
  41. | Or'(l1), Or'(l2)) -> List.for_all2 expr'_eq l1 l2
  42. | (Set'(var1, val1), Set'(var2, val2)
  43. | Def'(var1, val1), Def'(var2, val2)) -> (expr'_eq var1 var2) &&
  44. (expr'_eq val1 val2)
  45. | LambdaSimple'(vars1, body1), LambdaSimple'(vars2, body2) ->
  46. (List.for_all2 String.equal vars1 vars2) &&
  47. (expr'_eq body1 body2)
  48. | LambdaOpt'(vars1, var1, body1), LambdaOpt'(vars2, var2, body2) ->
  49. (String.equal var1 var2) &&
  50. (List.for_all2 String.equal vars1 vars2) &&
  51. (expr'_eq body1 body2)
  52. | Applic'(e1, args1), Applic'(e2, args2)
  53. | ApplicTP'(e1, args1), ApplicTP'(e2, args2) ->
  54. (expr'_eq e1 e2) &&
  55. (List.for_all2 expr'_eq args1 args2)
  56. | _ -> false;;
  57.  
  58.  
  59. exception X_syntax_error;;
  60.  
  61. module type SEMANTICS = sig
  62. val run_semantics : expr -> expr'
  63. val annotate_lexical_addresses : expr -> expr'
  64. val annotate_tail_calls : expr' -> expr'
  65. val box_set : expr' -> expr'
  66. end;;
  67.  
  68. module Semantics : SEMANTICS = struct
  69.  
  70. let rec _find_minor_index_ x params =
  71. match params with
  72. |[] -> raise X_syntax_error
  73. |a::b -> if x=a then 0 else 1 + _find_minor_index_ x b;;
  74.  
  75. let rec _exists_major_index_ x simulated_scope =
  76. if(simulated_scope = [])
  77. then false
  78. else(
  79. let _head_ = List.hd simulated_scope in
  80. let _tail_ = List.tl simulated_scope in
  81. if(List.mem x _head_)
  82. then true
  83. else(
  84. if (_tail_ = [])
  85. then false
  86. else _exists_major_index_ x _tail_
  87. ));;
  88.  
  89. let rec _find_major_index_ x simulated_scope =
  90. match simulated_scope with
  91. |[]->raise X_syntax_error
  92. |[[]] -> raise X_syntax_error
  93. |a::b -> if (List.mem x a)
  94. then 0
  95. else 1 + _find_major_index_ x b;;
  96.  
  97. let rec _ala_helper_ e params simulated_scope =
  98. let _matcher_ e params simulated_scope =
  99. match e with
  100. |Const(a)->Const'(a)
  101. |If(a,b,c)->If'(_ala_helper_ a params simulated_scope,_ala_helper_ b params simulated_scope,_ala_helper_ c params simulated_scope)
  102. |Seq(exprlist)->Seq'(List.map (fun(x)->_ala_helper_ x params simulated_scope) exprlist)
  103. |Set(a,b)->Set'(_ala_helper_ a params simulated_scope,_ala_helper_ b params simulated_scope)
  104. |Def(a,b)->Def'(_ala_helper_ a params simulated_scope,_ala_helper_ b params simulated_scope)
  105. |Or(exprlist)->Or'(List.map (fun(x)->_ala_helper_ x params simulated_scope) exprlist)
  106. |Applic(a,exprlist)->Applic'(_ala_helper_ a params simulated_scope ,(List.map (fun(x)->_ala_helper_ x params simulated_scope) exprlist))
  107. |Var(a)-> (
  108. if (List.mem a params)
  109. then (
  110. let _minor_index_ = _find_minor_index_ a params in
  111. Var'(VarParam(a,_minor_index_))
  112. )
  113. else(
  114. if (_exists_major_index_ a simulated_scope)
  115. then(
  116. let _major_index_ = _find_major_index_ a simulated_scope in
  117. let _minor_index_ = _find_minor_index_ a (List.nth simulated_scope _major_index_) in
  118. Var'(VarBound(a,_major_index_,_minor_index_))
  119. )
  120. else Var'(VarFree(a))
  121. ))
  122. |LambdaSimple(varlist,exprlist)-> _handle_lambda_ e params simulated_scope
  123. |LambdaOpt(varlist,varopt,exprlist)-> _handle_lambda_ e params simulated_scope
  124. in (_matcher_ e params simulated_scope)
  125.  
  126. and _handle_lambda_ e params simulated_scope =
  127. match e with
  128. |LambdaSimple(varlist,exprlist)-> let simulated_scope = [params]@simulated_scope in
  129. let params = varlist in
  130. LambdaSimple'(varlist,_ala_helper_ exprlist params simulated_scope)
  131. |LambdaOpt(varlist,varopt,exprlist)-> let simulated_scope = [params]@simulated_scope in
  132. let params = varlist@[varopt] in
  133. LambdaOpt'(varlist,varopt,_ala_helper_ exprlist params simulated_scope)
  134. |_->raise X_syntax_error;;
  135.  
  136. let annotate_lexical_addresses e =
  137. _ala_helper_ e [] [];;
  138.  
  139. let rec _atc_helper_ e tp =
  140. let _matcher_ e tp =
  141. match e with
  142. |Const'(a)->Const'(a)
  143. |Var'(a)->Var'(a)
  144. |Applic'(expr,exprlist)-> if tp
  145. then ApplicTP'(_atc_helper_ expr false,List.map (fun(x)-> _atc_helper_ x false) exprlist)
  146. else Applic'(_atc_helper_ expr false,List.map (fun(x)-> _atc_helper_ x false) exprlist)
  147. |Or'(exprlist)-> (let last = List.hd (List.rev exprlist) in
  148. let reisha =List.rev (List.tl (List.rev exprlist)) in
  149. Or'((List.map (fun(x)->_atc_helper_ x false) reisha)@[_atc_helper_ last tp])
  150. )
  151. |If'(test,dit,dif)->If'(_atc_helper_ test false, _atc_helper_ dit tp,_atc_helper_ dif tp)
  152. |Def'(a,b)->Def'(a,_atc_helper_ b false)
  153. |LambdaSimple'(varlist,exprlist)->LambdaSimple'(varlist,_atc_helper_ exprlist true)
  154. |LambdaOpt'(varlist,varopt,exprlist)->LambdaOpt'(varlist,varopt,_atc_helper_ exprlist true)
  155. |Seq'(exprlist)->(let last = List.hd (List.rev exprlist) in
  156. let reisha =List.rev (List.tl (List.rev exprlist)) in
  157. Seq'((List.map (fun(x)->_atc_helper_ x false) reisha)@[_atc_helper_ last tp])
  158. )
  159. |Set'(a,b) -> Set'(_atc_helper_ a false,_atc_helper_ b false)
  160. |_->raise X_syntax_error
  161. in (_matcher_ e tp);;
  162.  
  163. let annotate_tail_calls e = _atc_helper_ e false;;
  164.  
  165. let rec box_set_helper e need_boxing_list =
  166. let matcher e need_boxing_list =
  167. match e with
  168. |Const'(a)->Const'(a)
  169. |Var'(a)-> (match a with
  170. |VarFree(name)-> Var'(a)
  171. |VarParam(name,minor)-> if(List.mem a need_boxing_list)
  172. then(BoxGet'(VarParam(name,minor)))
  173. else(Var'(a))
  174. |VarBound(name,major,minor)-> if(List.mem a need_boxing_list)
  175. then(BoxGet'(VarBound(name,major,minor)))
  176. else(Var'(a))
  177. )
  178. |Applic'(expr,exprlist)->Applic'(box_set_helper expr need_boxing_list, List.map (fun(x)->box_set_helper x need_boxing_list) exprlist)
  179. |ApplicTP'(expr,exprlist)->ApplicTP'(box_set_helper expr need_boxing_list, List.map (fun(x)->box_set_helper x need_boxing_list) exprlist)
  180. |Or'(exprlist)->Or'(List.map (fun(x)->box_set_helper x need_boxing_list) exprlist)
  181. |If'(test,dit,dif)->If'(box_set_helper test need_boxing_list,box_set_helper dit need_boxing_list,box_set_helper dif need_boxing_list)
  182. |Def'(a,b)->Def'(box_set_helper a need_boxing_list,box_set_helper b need_boxing_list)
  183. |LambdaSimple'(varlist,exprlist)-> let need_boxing_list = (List.map (fun(x)-> match x with
  184. |VarParam(name,minor)->VarBound(name,0,minor)
  185. |VarBound(name,major,minor)->VarBound(name,major+1,minor)
  186. |a->a) need_boxing_list) in
  187. let vars_to_set = [] in
  188. let vars_to_set,need_boxing_list = (lambda_helper varlist varlist exprlist vars_to_set need_boxing_list) in
  189. if(vars_to_set = [])
  190. then (LambdaSimple'(varlist, box_set_helper exprlist need_boxing_list))
  191. else (LambdaSimple'(varlist, Seq'(vars_to_set@[box_set_helper exprlist need_boxing_list])))
  192. |LambdaOpt'(varlist,varopt,exprlist)-> let need_boxing_list = (List.map (fun(x)-> match x with
  193. |VarParam(name,minor)->VarBound(name,0,minor)
  194. |VarBound(name,major,minor)->VarBound(name,major+1,minor)
  195. |a->a) need_boxing_list) in
  196. let vars_to_set = [] in
  197. let vars_to_set,need_boxing_list = (lambda_helper (varlist@[varopt]) (varlist@[varopt]) exprlist vars_to_set need_boxing_list) in
  198. if(vars_to_set = [])
  199. then (LambdaOpt'(varlist,varopt, box_set_helper exprlist need_boxing_list))
  200. else (LambdaOpt'(varlist,varopt, Seq'(vars_to_set @[box_set_helper exprlist need_boxing_list])))
  201. |Seq'(exprlist)->Seq'(List.map (fun(x)->box_set_helper x need_boxing_list) exprlist)
  202. |Set'(Var'(a),b)->(match a with
  203. |VarFree(name)->Set'(Var'(a),box_set_helper b need_boxing_list)
  204. |VarParam(name,minor)->if(List.mem a need_boxing_list)
  205. then(BoxSet'(a,box_set_helper b need_boxing_list))
  206. else(Set'(Var'(a),box_set_helper b need_boxing_list))
  207. |VarBound(name,major,minor)-> if(List.mem a need_boxing_list)
  208. then(BoxSet'(a,box_set_helper b need_boxing_list))
  209. else(Set'(Var'(a),box_set_helper b need_boxing_list))
  210. )
  211. |_->raise X_syntax_error
  212. in (matcher e need_boxing_list)
  213.  
  214. and lambda_helper varlist_full varlist exprlist vars_to_set need_boxing_list =
  215. match varlist with
  216. |[]-> vars_to_set,need_boxing_list
  217. |var::rest -> (
  218. if(need_boxing var exprlist)
  219. then(
  220. let minor_index = _find_minor_index_ var varlist_full in
  221. let vars_to_set = vars_to_set@[Set'(Var'(VarParam(var,minor_index)),Box'(VarParam(var,minor_index)))] in
  222. let current = VarParam(var,minor_index) in
  223. let need_boxing_list = need_boxing_list@[current] in
  224. (lambda_helper varlist_full rest exprlist vars_to_set need_boxing_list)
  225. )
  226. else (lambda_helper varlist_full rest exprlist vars_to_set need_boxing_list)
  227. )
  228.  
  229. and check_read var body counter =
  230. match body with
  231. |Const'(a)->[]
  232. |Var'(a)->(match a with
  233. |VarParam(name,mn)->if(name=var) then (if (counter=0) then [0] else [-1]) else []
  234. |VarBound(name,mj,mn)->if(name=var) then (if (counter=0) then [0] else [-1]) else []
  235. |_->[])
  236. |Applic'(expr,exprlist)-> (check_read var expr counter)@(List.flatten (List.map (fun(x)-> check_read var x counter) exprlist))
  237. |ApplicTP'(expr,exprlist)->(check_read var expr counter)@(List.flatten (List.map (fun(x)-> check_read var x counter) exprlist))
  238. |Or'(exprlist)->(List.flatten (List.map (fun(x)-> check_read var x counter) exprlist))
  239. |If'(test,dit,dif)-> (check_read var test counter)@(check_read var dit counter)@(check_read var dif counter)
  240. |Def'(a,b)->(check_read var a counter)@(check_read var b counter)
  241. |LambdaSimple'(varlist,exprlist)-> let counter = counter+1 in
  242. if((check_read var exprlist counter) = [])
  243. then []
  244. else [counter]
  245. |LambdaOpt'(varlist,varopt,exprlist)-> let counter = counter+1 in
  246. if((check_read var exprlist counter) = [])
  247. then []
  248. else [counter]
  249. |Seq'(exprlist)->(List.flatten (List.map (fun(x)-> check_read var x counter) exprlist))
  250. |Set'(a,b)->(check_read var a counter)@(check_read var b counter)
  251. |_->raise X_syntax_error
  252.  
  253. and check_write var body counter =
  254. match body with
  255. |Const'(a)->[]
  256. |Set'(Var'(a),b)-> (match a with
  257. |VarParam(name,mn)->if(name=var) then (if (counter=0) then [0] else [-1]) else []
  258. |VarBound(name,mj,mn)-> if(name=var) then (if (counter=0) then [0] else [-1]) else []
  259. |_->[])
  260. |Applic'(expr,exprlist)-> (check_write var expr counter)@(List.flatten (List.map (fun(x)-> check_write var x counter) exprlist))
  261. |ApplicTP'(expr,exprlist)->(check_write var expr counter)@(List.flatten (List.map (fun(x)-> check_write var x counter) exprlist))
  262. |Or'(exprlist)->(List.flatten (List.map (fun(x)-> check_write var x counter) exprlist))
  263. |If'(test,dit,dif)-> (check_write var test counter)@(check_write var dit counter)@(check_write var dif counter)
  264. |Def'(a,b)->(check_write var a counter)@(check_write var b counter)
  265. |LambdaSimple'(varlist,exprlist)-> let counter = counter+1 in
  266. if((check_write var exprlist counter) = [])
  267. then []
  268. else [counter]
  269. |LambdaOpt'(varlist,varopt,exprlist)->let counter = counter+1 in
  270. if((check_write var exprlist counter) = [])
  271. then []
  272. else [counter]
  273. |Seq'(exprlist)->(List.flatten (List.map (fun(x)-> check_write var x counter) exprlist))
  274. |Var'(a)->[]
  275. |_->raise X_syntax_error
  276.  
  277. and need_boxing var body=
  278. let read_list = check_read var body 0 in
  279. let write_list = check_write var body 0 in
  280. if (not((read_list = [])&&(write_list = [])))
  281. then(
  282. let cart = List.flatten (List.map (fun(x)-> (List.map (fun(y)-> [x;y]) write_list)) read_list) in
  283. let mapped = (List.map (fun(x)-> match x with
  284. |[a;b]-> a=b
  285. |_->false) cart) in
  286. if (List.mem false mapped)
  287. then true
  288. else false
  289. )
  290. else false;;
  291.  
  292.  
  293. let rec box_set_helper e need_boxing_list =
  294. let matcher e need_boxing_list =
  295. match e with
  296. |Const'(a)->Const'(a)
  297. |Var'(a)-> (match a with
  298. |VarFree(name)-> Var'(a)
  299. |VarParam(name,minor)-> if(List.mem a need_boxing_list)
  300. then(BoxGet'(VarParam(name,minor)))
  301. else(Var'(a))
  302. |VarBound(name,major,minor)-> if(List.mem a need_boxing_list)
  303. then(BoxGet'(VarBound(name,major,minor)))
  304. else(Var'(a))
  305. )
  306. |Applic'(expr,exprlist)->Applic'(box_set_helper expr need_boxing_list, List.map (fun(x)->box_set_helper x need_boxing_list) exprlist)
  307. |ApplicTP'(expr,exprlist)->ApplicTP'(box_set_helper expr need_boxing_list, List.map (fun(x)->box_set_helper x need_boxing_list) exprlist)
  308. |Or'(exprlist)->Or'(List.map (fun(x)->box_set_helper x need_boxing_list) exprlist)
  309. |If'(test,dit,dif)->If'(box_set_helper test need_boxing_list,box_set_helper dit need_boxing_list,box_set_helper dif need_boxing_list)
  310. |Def'(a,b)->Def'(box_set_helper a need_boxing_list,box_set_helper b need_boxing_list)
  311. |LambdaSimple'(varlist,exprlist)-> let need_boxing_list = (List.map (fun(x)-> match x with
  312. |VarParam(name,minor)->VarBound(name,0,minor)
  313. |VarBound(name,major,minor)->VarBound(name,major+1,minor)
  314. |a->a) need_boxing_list) in
  315. let vars_to_set = [] in
  316. let vars_to_set,need_boxing_list = (lambda_helper varlist varlist exprlist vars_to_set need_boxing_list) in
  317. if(vars_to_set = [])
  318. then (LambdaSimple'(varlist, box_set_helper exprlist need_boxing_list))
  319. else (LambdaSimple'(varlist, Seq'(vars_to_set@[box_set_helper exprlist need_boxing_list])))
  320. |LambdaOpt'(varlist,varopt,exprlist)-> let need_boxing_list = (List.map (fun(x)-> match x with
  321. |VarParam(name,minor)->VarBound(name,0,minor)
  322. |VarBound(name,major,minor)->VarBound(name,major+1,minor)
  323. |a->a) need_boxing_list) in
  324. let vars_to_set = [] in
  325. let vars_to_set,need_boxing_list = (lambda_helper (varlist@[varopt]) (varlist@[varopt]) exprlist vars_to_set need_boxing_list) in
  326. if(vars_to_set = [])
  327. then (LambdaOpt'(varlist,varopt, box_set_helper exprlist need_boxing_list))
  328. else (LambdaOpt'(varlist,varopt, Seq'(vars_to_set @[box_set_helper exprlist need_boxing_list])))
  329. |Seq'(exprlist)->Seq'(List.map (fun(x)->box_set_helper x need_boxing_list) exprlist)
  330. |Set'(Var'(a),b)->(match a with
  331. |VarFree(name)->Set'(Var'(a),box_set_helper b need_boxing_list)
  332. |VarParam(name,minor)->if(List.mem a need_boxing_list)
  333. then(BoxSet'(a,box_set_helper b need_boxing_list))
  334. else(Set'(Var'(a),box_set_helper b need_boxing_list))
  335. |VarBound(name,major,minor)-> if(List.mem a need_boxing_list)
  336. then(BoxSet'(a,box_set_helper b need_boxing_list))
  337. else(Set'(Var'(a),box_set_helper b need_boxing_list))
  338. )
  339. |_->raise X_syntax_error
  340. in (matcher e need_boxing_list)
  341.  
  342. and lambda_helper varlist_full varlist exprlist vars_to_set need_boxing_list =
  343. match varlist with
  344. |[]-> vars_to_set,need_boxing_list
  345. |var::rest -> (
  346. if(need_boxing var exprlist)
  347. then(
  348. let minor_index = _find_minor_index_ var varlist_full in
  349. let vars_to_set = vars_to_set@[Set'(Var'(VarParam(var,minor_index)),Box'(VarParam(var,minor_index)))] in
  350. let current = VarParam(var,minor_index) in
  351. let need_boxing_list = need_boxing_list@[current] in
  352. (lambda_helper varlist_full rest exprlist vars_to_set need_boxing_list)
  353. )
  354. else (lambda_helper varlist_full rest exprlist vars_to_set need_boxing_list)
  355. )
  356.  
  357. and check_read var body counter =
  358. match body with
  359. |Const'(a)->[]
  360. |Var'(a)->(match a with
  361. |VarParam(name,mn)->if(name=var) then (if ((!counter)=0) then [0] else [-1]) else []
  362. |VarBound(name,mj,mn)->if(name=var) then (if ((!counter)=0) then [0] else [-1]) else []
  363. |_->[])
  364. |Applic'(expr,exprlist)-> (check_read var expr counter)@(List.flatten (List.map (fun(x)-> check_read var x counter) exprlist))
  365. |ApplicTP'(expr,exprlist)->(check_read var expr counter)@(List.flatten (List.map (fun(x)-> check_read var x counter) exprlist))
  366. |Or'(exprlist)->(List.flatten (List.map (fun(x)-> check_read var x counter) exprlist))
  367. |If'(test,dit,dif)-> (check_read var test counter)@(check_read var dit counter)@(check_read var dif counter)
  368. |Def'(a,b)->(check_read var a counter)@(check_read var b counter)
  369. |LambdaSimple'(varlist,exprlist)-> counter := (!counter)+1 ;
  370. if((check_read var exprlist counter) = [])
  371. then []
  372. else [(!counter)]
  373. |LambdaOpt'(varlist,varopt,exprlist)-> counter := (!counter)+1 ;
  374. if((check_read var exprlist counter) = [])
  375. then []
  376. else [(!counter)]
  377. |Seq'(exprlist)->(List.flatten (List.map (fun(x)-> check_read var x counter) exprlist))
  378. |Set'(a,b)->(check_read var b counter)
  379. |_->raise X_syntax_error
  380.  
  381. and check_write var body counter =
  382. match body with
  383. |Const'(a)->[]
  384. |Set'(Var'(a),b)-> (match a with
  385. |VarParam(name,mn)->if(name=var) then (if ((!counter)=0) then [0] else [-1]) else []
  386. |VarBound(name,mj,mn)-> if(name=var) then (if ((!counter)=0) then [0] else [-1]) else []
  387. |_->[])
  388. |Applic'(expr,exprlist)-> (check_write var expr counter)@(List.flatten (List.map (fun(x)-> check_write var x counter) exprlist))
  389. |ApplicTP'(expr,exprlist)->(check_write var expr counter)@(List.flatten (List.map (fun(x)-> check_write var x counter) exprlist))
  390. |Or'(exprlist)->(List.flatten (List.map (fun(x)-> check_write var x counter) exprlist))
  391. |If'(test,dit,dif)-> (check_write var test counter)@(check_write var dit counter)@(check_write var dif counter)
  392. |Def'(a,b)->(check_write var a counter)@(check_write var b counter)
  393. |LambdaSimple'(varlist,exprlist)-> counter := (!counter)+1 ;
  394. if((check_write var exprlist counter) = [])
  395. then []
  396. else [(!counter)]
  397. |LambdaOpt'(varlist,varopt,exprlist)->counter := (!counter)+1 ;
  398. if((check_write var exprlist counter) = [])
  399. then []
  400. else [(!counter)]
  401. |Seq'(exprlist)->(List.flatten (List.map (fun(x)-> check_write var x counter) exprlist))
  402. |Var'(a)->[]
  403. |_->raise X_syntax_error
  404.  
  405. and need_boxing var body=
  406. let read_counter = ref 0 in
  407. let write_counter = ref 0 in
  408. let read_list = check_read var body read_counter in
  409. let write_list = check_write var body write_counter in
  410. if (not((read_list = [])&&(write_list = [])))
  411. then(
  412. let cart = List.flatten (List.map (fun(x)-> (List.map (fun(y)-> [x;y]) write_list)) read_list) in
  413. let mapped = (List.map (fun(x)-> match x with
  414. |[a;b]-> a=b
  415. |_->false) cart) in
  416. if (List.mem false mapped)
  417. then true
  418. else false
  419. )
  420. else false;;
  421.  
  422. let box_set e = box_set_helper e [];;
  423.  
  424. let run_semantics expr =
  425. box_set
  426. (annotate_tail_calls
  427. (annotate_lexical_addresses expr));;
  428.  
  429. end;; (* struct Semantics *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement