Advertisement
Guest User

Untitled

a guest
May 21st, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.19 KB | None | 0 0
  1. open List;;
  2. type prog = Prog of stmt
  3. and stmt = CompStmt of (stmt * stmt) |
  4. AssignStmt of (string * exp) |
  5. PrintStmt of exp |
  6. IfStmt of (exp * stmt * stmt) |
  7. WhileStmt of (exp * stmt)
  8. and exp = Number of int |
  9. Id of string |
  10. PlusOp of (exp * exp) |
  11. MinusOp of (exp * exp) |
  12. MulOp of (exp * exp) |
  13. DivOp of (exp * exp)
  14. and node = Node of stmt
  15. and pred = node
  16. and succ = node
  17. and edge = pred * succ * int
  18. and nodeList = node list
  19. and edgeList = edge list
  20. and cfg = nodeList * edgeList * node * nodeList;; (* node list, edge list, first node, last nodes*)
  21.  
  22. let ast =
  23. CompStmt(AssignStmt("a",PlusOp(Id("a"),Id("b"))),
  24. CompStmt(AssignStmt("b",MinusOp(Id("a"),Id("b"))),
  25. CompStmt(AssignStmt("a",MinusOp(Id("a"),Id("b"))), WhileStmt(Id("c"),CompStmt(AssignStmt("x",MulOp(Id("x"),Id("y"))),
  26. AssignStmt("y",DivOp(Id("y"),Number(2))))))));;
  27. let rec addToNodeList (listIn: node list) (el: node)
  28. = match listIn with
  29. | [] -> [el]
  30. | h::t -> h::(addToNodeList t el);;
  31.  
  32. let rec addToEdgeList (listIn: edge list) (el: edge)
  33. = match listIn with
  34. | [] -> [el]
  35. | h::t -> h::(addToEdgeList t el);;
  36.  
  37. let rec addEdgeListToEdgeList (edgeList : edge list) (newEdgeList : edge list) =
  38. match edgeList with
  39. | [] -> newEdgeList
  40. | h::t -> h::(addEdgeListToEdgeList t newEdgeList)
  41. (* let rec getLastSucNode (edgeList: edge list) : node list =
  42. match edgeList with
  43. | [pred, succ, int] -> succ
  44. | h::t -> getLastSucNode t;; *)
  45.  
  46. let rec getDefList (nodeList: node list) : string list =
  47. begin
  48. match nodeList with
  49. | [] -> ["_"]
  50. | Node(h)::t ->
  51. begin
  52. match h with
  53. | CompStmt(st1, st2) -> ["ERROR"]
  54. | AssignStmt(var, exp) -> var::(getDefList t)
  55. | PrintStmt(exp) -> "_"::(getDefList t)
  56. | IfStmt(exp, stmt1, strm2) -> "_"::(getDefList t)
  57. | WhileStmt(exp, stmt) -> "_"::(getDefList t)
  58. end
  59. end
  60.  
  61. let rec getSuccForNode (edgeList: edge list) (node: node) : node list =
  62. begin
  63. match edgeList with
  64. | [] -> []
  65. | h::t ->
  66. begin
  67. match h with
  68. | (pred, succ, _) -> if pred == node then succ::(getSuccForNode t node)
  69. else (getSuccForNode t node)
  70. end
  71. end
  72.  
  73. let rec genNodes (transfAst: stmt) (nlist: node list) : node list =
  74. begin
  75. match transfAst with
  76. | CompStmt (st1, st2) -> genNodes st2 (genNodes st1 nlist)
  77. | AssignStmt (var, exp) -> addToNodeList nlist (Node(AssignStmt(var, exp)))
  78. | PrintStmt(exp) -> addToNodeList nlist (Node (PrintStmt (exp)))
  79. | IfStmt (exp, stmt1, stmt2) -> genNodes stmt2 (genNodes stmt1 (addToNodeList nlist (Node (IfStmt(exp,stmt1,stmt2)))))
  80. | WhileStmt (exp, stmt) -> genNodes stmt (addToNodeList nlist (Node (WhileStmt(exp, stmt))))
  81. end
  82.  
  83. let rec getLastCompNode (transfAst: stmt) : node =
  84. begin
  85. match transfAst with
  86. | CompStmt(_,st2) -> getLastCompNode (st2)
  87. | AssignStmt (var,exp) -> Node(AssignStmt(var,exp))
  88. | PrintStmt(exp) -> Node(PrintStmt(exp))
  89. | IfStmt(exp,stmt1,stmt2) -> Node(IfStmt(exp,stmt1,stmt2))
  90. | WhileStmt(exp,stmt) -> Node(WhileStmt(exp,stmt))
  91. end
  92.  
  93. let rec getFirstCompNode (transfAst: stmt) : node =
  94. begin
  95. match transfAst with
  96. | CompStmt(st1,_) -> getLastCompNode (st1)
  97. | AssignStmt (var,exp) -> Node(AssignStmt(var,exp))
  98. | PrintStmt(exp) -> Node(PrintStmt(exp))
  99. | IfStmt(exp,stmt1,stmt2) -> Node(IfStmt(exp,stmt1,stmt2))
  100. | WhileStmt(exp,stmt) -> Node(WhileStmt(exp,stmt))
  101. end
  102.  
  103. let rec genEdges (transfAst: stmt) (n: int) : edge list =
  104. begin
  105. match transfAst with
  106. | CompStmt (st1, st2) -> let firstList = (genEdges st1 (n+1)) in begin
  107. (getLastCompNode(st1), getFirstCompNode(st2), n)::List.append firstList (genEdges st2 (n+(List.length firstList)+1))
  108. end
  109. | AssignStmt (var, exp) -> []
  110. | PrintStmt (exp) -> []
  111. | IfStmt (exp, st1, st2) -> let firstList = (genEdges st1 (n+2)) in begin
  112. (Node(IfStmt(exp,st1,st2)),getFirstCompNode(st1),n) ::
  113. ((Node(IfStmt(exp,st1,st2)),getFirstCompNode(st2),n+1) ::
  114. List.append firstList (genEdges st2 (n+2+(List.length firstList))))
  115. end
  116. | WhileStmt (exp, st) -> (Node(WhileStmt(exp,st)),getFirstCompNode(st),n) ::
  117. ((getLastCompNode(st),Node(WhileStmt(exp,st)),n+1) ::
  118. (genEdges st (n+2)))
  119. end
  120.  
  121. let rec print_exp (expr: exp) =
  122. begin
  123. match expr with
  124. | Number(nr) -> Printf.printf "%d" nr
  125. | Id (id) -> Printf.printf "%s" id
  126. | PlusOp (exp1, exp2) -> print_exp exp1; Printf.printf " + "; print_exp exp2
  127. | MinusOp (exp1, exp2) -> print_exp exp1; Printf.printf " - "; print_exp exp2
  128. | MulOp (exp1, exp2) -> print_exp exp1; Printf.printf " * "; print_exp exp2
  129. | DivOp (exp1, exp2) -> print_exp exp1; Printf.printf " / "; print_exp exp2
  130. end
  131.  
  132. let print_Stmt (stmt: stmt) =
  133. begin
  134. match stmt with
  135. | CompStmt (st1, st2) -> Printf.printf "comp print error\n"
  136. | AssignStmt (var1, exp1) -> Printf.printf "%s = " var1; print_exp exp1; Printf.printf "\n"
  137. | PrintStmt (exp1) -> Printf.printf "Print stmt: "; print_exp exp1; Printf.printf "\n"
  138. | IfStmt (exp1, stm1, stm2) -> Printf.printf "it is if\n"
  139. | WhileStmt (exp1, stm1) -> Printf.printf "it is while\n"
  140. end
  141.  
  142. let rec print_NodeList = function
  143. [] -> print_string "\n"
  144. | (Node (stmt))::l -> print_Stmt stmt; print_NodeList l;;
  145.  
  146.  
  147. let rec print_StringList = function
  148. [] -> print_string "\n"
  149. | str::l -> print_string str; print_StringList l;;
  150.  
  151. let rec print_EdgeList = function
  152. [] -> print_string "\n"
  153. | (Node(pred), Node(succ), n)::l -> Printf.printf "Edge nr = %d\n" n; Printf.printf "Pred list:\n"; print_Stmt pred;
  154. Printf.printf "Succ list:\n"; print_Stmt succ; print_EdgeList l;;
  155.  
  156. let rec getFirstNode (transfAst: stmt) =
  157. begin
  158. match transfAst with
  159. | CompStmt (st1, _) -> getFirstNode (st1)
  160. | AssignStmt (var, exp) -> Node (AssignStmt (var, exp))
  161. | PrintStmt (exp) -> Node (PrintStmt (exp))
  162. | IfStmt (exp, st1, st2) -> Node (IfStmt (exp, st1, st2))
  163. | WhileStmt (exp, st) -> Node (WhileStmt (exp, st))
  164. end
  165.  
  166. let rec genLastNodes (transfAst: stmt) (lastNodes: node list) =
  167. begin
  168. match transfAst with
  169. | CompStmt (_, st) -> genLastNodes st lastNodes
  170. | AssignStmt (var, exp) -> addToNodeList lastNodes (Node (AssignStmt (var, exp)))
  171. | PrintStmt (exp) -> addToNodeList lastNodes (Node (PrintStmt (exp)))
  172. | IfStmt (_, st1, st2) -> genLastNodes st2 (genLastNodes st1 lastNodes)
  173. | WhileStmt (exp, st) -> addToNodeList [getLastCompNode(st)] (Node (WhileStmt (exp, st)))
  174. end
  175.  
  176. let print_controlFlowG (cfg: cfg) =
  177. match cfg with
  178. | (nlist, elist, (Node (stmt)), lastn) -> Printf.printf "First node: ";print_Stmt (stmt); Printf.printf "Node list:\n";
  179. print_NodeList nlist; Printf.printf "Edge list:\n"; print_EdgeList elist; Printf.printf "Last nodes list:\n";
  180. print_NodeList lastn;;
  181.  
  182. let transformAst (transfAst: stmt) =
  183. (genNodes transfAst [], genEdges transfAst 1, getFirstNode transfAst, genLastNodes transfAst [])
  184.  
  185. let rez = transformAst ast;;
  186. (* print_controlFlowG rez;; *)
  187. let asd = getDefList (genNodes ast []);;
  188. print_StringList asd;;
  189.  
  190. (* let rez = genEdges ast 1;;
  191. print_EdgeList rez;; *)
  192.  
  193.  
  194.  
  195. (* let rec genEdges (transfAst: stmt) (elist: edge list) (pred: node list) (succ: node list) (n: int) =
  196. begin
  197. match transfAst with
  198. | CompStmt (st1, st2) -> genEdges st2 (genEdges st1 elist pred (getCompSucc transfAst [] 0) n) (getCompPred transfAst [] 0) succ (n+1)
  199. | AssignStmt (_, _) -> addToEdgeList elist (pred, succ, n)
  200. | PrintStmt (_) -> addToEdgeList elist (pred, succ, n)
  201. | IfStmt (_, st1, st2) -> genEdges st2 (genEdges st1 (addToEdgeList elist (pred, succ, n)) pred succ (n+1)) pred succ n
  202. | WhileStmt (exp, st) -> genEdges st (addToEdgeList elist ((getPredForWhile st pred), (getSuccForWhile st succ), n)) [(Node (WhileStmt (exp, st)))] [(Node (WhileStmt (exp, st)))] (n+1)
  203. end *)
  204. (* let rec getCompPred (transfAst: stmt) (predList: node list) (firstCall: int) =
  205. begin
  206. match transfAst with
  207. | CompStmt (st1, st2) ->
  208. if firstCall = 0 then
  209. (match st1 with
  210. | CompStmt (_, _) -> getCompPred st2 predList 0
  211. | AssignStmt (_, _) -> getCompPred st1 predList 1
  212. | PrintStmt (_) -> getCompPred st1 predList 1
  213. | IfStmt (_, st3, st4) -> getCompPred st4 (getCompPred st3 predList 1) 1
  214. | WhileStmt (_, st3) -> getCompPred st3 predList 1
  215. ) else (getCompPred st1 predList 1)
  216. | AssignStmt (var, exp) -> addToNodeList predList (Node (AssignStmt (var, exp)))
  217. | PrintStmt (exp) -> addToNodeList predList (Node (PrintStmt (exp)))
  218. | IfStmt (exp, st1, st2) -> addToNodeList predList (Node (IfStmt (exp, st1, st2)))
  219. | WhileStmt (exp, st) -> addToNodeList predList (Node (WhileStmt (exp, st)))
  220. end
  221.  
  222.  
  223. let rec getCompSucc (transfAst: stmt) (succList: node list) (firstCall: int) =
  224. begin
  225. match transfAst with
  226. | CompStmt (st1, st2) ->
  227. if firstCall = 0 then (
  228. match st1 with
  229. | CompStmt (_, _) -> getCompSucc st1 succList 0
  230. | AssignStmt (_, _) -> getCompSucc st2 succList 1
  231. | PrintStmt (_) -> getCompSucc st2 succList 1
  232. | IfStmt (_, st3, st4) -> getCompSucc st4 (getCompSucc st3 succList 1) 1
  233. | WhileStmt (_, st3) -> getCompSucc st3 (getCompSucc st2 succList 1) 1
  234. ) else (getCompSucc st1 succList 1)
  235. | AssignStmt (var, exp) -> addToNodeList succList (Node (AssignStmt (var, exp)))
  236. | PrintStmt (exp) -> addToNodeList succList (Node (PrintStmt (exp)))
  237. | IfStmt (exp, st1, st2) -> addToNodeList succList (Node (IfStmt (exp, st1, st2)))
  238. | WhileStmt (exp, st) -> addToNodeList succList (Node (WhileStmt (exp, st)))
  239. end *)
  240.  
  241. (* let rec getPredForWhile (transfAst: stmt) (predList: node list) =
  242. begin
  243. match transfAst with
  244. | CompStmt (_, st2) -> getPredForWhile st2 predList
  245. | AssignStmt (var, exp) -> addToNodeList predList (Node (AssignStmt (var, exp)))
  246. | PrintStmt (exp1) -> addToNodeList predList (Node (PrintStmt (exp1)))
  247. | IfStmt (_, st1, st2) -> getPredForWhile st1 (getPredForWhile st2 predList)
  248. | WhileStmt (exp, st) -> addToNodeList predList (Node (WhileStmt (exp, st)))
  249. end
  250.  
  251. let rec getSuccForWhile (transfAst: stmt) (succList: node list) =
  252. begin
  253. if succList = [] then
  254. (match transfAst with
  255. | CompStmt (st1, _) -> getSuccForWhile st1 succList
  256. | AssignStmt (var, exp) -> addToNodeList succList (Node (AssignStmt (var, exp)))
  257. | PrintStmt (exp) -> addToNodeList succList (Node (PrintStmt (exp)))
  258. | IfStmt (exp, st1, st2) -> addToNodeList succList (Node (IfStmt (exp, st1, st2)))
  259. | WhileStmt (exp, st) -> addToNodeList succList (Node (WhileStmt (exp, st)))
  260. )
  261. else succList
  262. end *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement