constructors.alc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. include "primitives.alh"
  2. include "conformance_scd.alh"
  3. include "library.alh"
  4. include "io.alh"
  5. include "modelling.alh"
  6. Element while_stack = ?
  7. Element variable_map = ?
  8. Element function construct_function():
  9. String command
  10. Element result
  11. Element main_function
  12. Boolean continue
  13. Element prev_element
  14. Element first_element
  15. // Initialize variables
  16. prev_element = read_root()
  17. main_function = read_root()
  18. // Clear global variables
  19. while_stack = create_node()
  20. variable_map = create_node()
  21. continue = True
  22. while (continue):
  23. command = input()
  24. if (command == "global"):
  25. result = construct_global()
  26. elif (command == "funcdef"):
  27. result = construct_funcdef(False)
  28. elif (command == "mutable_funcdef"):
  29. result = construct_funcdef(True)
  30. else:
  31. log("ERROR (1): did not understand command " + cast_e2s(command))
  32. output("ERROR: compiled code not understood: " + cast_e2s(command))
  33. return read_root()!
  34. continue = input()
  35. if (prev_element != read_root()):
  36. dict_add_fast(prev_element, "next", result["start"])
  37. else:
  38. first_element = result["start"]
  39. if (bool_and(element_eq(main_function, read_root()), command != "global")):
  40. // In case no main function is defined, it is the first defined function
  41. // This is mostly there to ensure backwards compatibility
  42. main_function = result["instruction"]
  43. prev_element = result["end"]
  44. if (value_eq(result["name"], "main")):
  45. // It was the function that we want to call
  46. main_function = result["instruction"]
  47. if (element_eq(main_function, read_root())):
  48. log("ERROR (2): no main function found")
  49. output("ERROR: no main function found")
  50. return read_root()!
  51. // Overwrite the main function with our declaration function
  52. prev_element = main_function["body"]
  53. dict_delete(main_function, "body")
  54. dict_add_fast(main_function, "body", first_element)
  55. dict_add_fast(result["end"], "next", prev_element)
  56. return main_function!
  57. Action function construct_global():
  58. Action this_element
  59. String declared_element
  60. String op
  61. this_element = create_value(!global)
  62. declared_element = input()
  63. dict_add_fast(this_element, "var", declared_element)
  64. op = input()
  65. if (op != "none"):
  66. // Defines
  67. Action assign
  68. Action resolve
  69. Action value
  70. assign = create_value(!assign)
  71. dict_add_fast(this_element, "next", assign)
  72. resolve = create_value(!resolve)
  73. dict_add_fast(assign, "var", resolve)
  74. dict_add_fast(resolve, "var", declared_element)
  75. if (op == "deref"):
  76. value = create_value(!constant)
  77. dict_add_fast(value, "node", import_node(input()))
  78. elif (op == "empty"):
  79. value = create_value(!call)
  80. Element res
  81. Element acc
  82. res = create_value(!resolve)
  83. acc = create_value(!access)
  84. dict_add_fast(value, "func", acc)
  85. dict_add_fast(acc, "var", res)
  86. dict_add_fast(res, "var", "create_node")
  87. elif (op == "const"):
  88. value = create_value(!constant)
  89. dict_add_fast(value, "node", input())
  90. dict_add_fast(assign, "value", value)
  91. Element result
  92. result = create_node()
  93. dict_add_fast(result, "name", "")
  94. dict_add_fast(result, "instruction", this_element)
  95. dict_add_fast(result, "start", this_element)
  96. dict_add_fast(result, "end", assign)
  97. return result!
  98. else:
  99. Element result
  100. result = create_node()
  101. dict_add_fast(result, "name", "")
  102. dict_add_fast(result, "instruction", this_element)
  103. dict_add_fast(result, "start", this_element)
  104. dict_add_fast(result, "end", this_element)
  105. return result!
  106. Action function construct_funcdef(mutable : Boolean):
  107. Action assign
  108. Action resolve
  109. Action constant
  110. Element formal
  111. Element func
  112. Element params
  113. Action declare
  114. String name
  115. declare = create_value(!global)
  116. assign = create_value(!assign)
  117. resolve = create_value(!resolve)
  118. constant = create_value(!constant)
  119. name = input()
  120. if (dict_in(variable_map, name)):
  121. formal = dict_read(variable_map, name)
  122. else:
  123. formal = name
  124. func = create_node()
  125. params = create_node()
  126. dict_add_fast(declare, "var", formal)
  127. dict_add_fast(declare, "next", assign)
  128. dict_add_fast(assign, "var", resolve)
  129. dict_add_fast(assign, "value", constant)
  130. dict_add_fast(resolve, "var", formal)
  131. dict_add_fast(constant, "node", func)
  132. dict_add_fast(func, "params", params)
  133. if (mutable):
  134. dict_add_fast(func, "mutable", create_node())
  135. Integer nrParams
  136. nrParams = input()
  137. Integer counter
  138. counter = 0
  139. Element param
  140. String arg_names_decl
  141. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  142. while (counter < nrParams):
  143. param = create_node()
  144. dict_add_fast(params, string_get(arg_names_decl, counter), param)
  145. dict_add_fast(param, "name", string_get(arg_names_decl, counter))
  146. dict_add_fast(variable_map, input(), param)
  147. // Output each parameter in turn
  148. counter = counter + 1
  149. // Now add the body
  150. dict_add_fast(func, "body", construct_unknown())
  151. Element result
  152. result = create_node()
  153. dict_add_fast(result, "name", name)
  154. dict_add_fast(result, "instruction", func)
  155. dict_add_fast(result, "start", declare)
  156. dict_add_fast(result, "end", assign)
  157. return result!
  158. Element function construct_unknown():
  159. String elem
  160. Element new_model
  161. Element new_model_model
  162. elem = input()
  163. if (elem == "if"):
  164. return construct_if()!
  165. elif (elem == "while"):
  166. return construct_while()!
  167. elif (elem == "access"):
  168. return construct_access()!
  169. elif (elem == "resolve"):
  170. return construct_resolve()!
  171. elif (elem == "assign"):
  172. return construct_assign()!
  173. elif (elem == "call"):
  174. return construct_call()!
  175. elif (elem == "return"):
  176. return construct_return()!
  177. elif (elem == "const"):
  178. return construct_const()!
  179. elif (elem == "declare"):
  180. return construct_declare()!
  181. elif (elem == "output"):
  182. return construct_output()!
  183. elif (elem == "input"):
  184. return construct_input()!
  185. elif (elem == "deref"):
  186. return construct_deref()!
  187. elif (elem == "break"):
  188. return construct_break()!
  189. elif (elem == "continue"):
  190. return construct_continue()!
  191. elif (elem == "model"):
  192. construct_model()
  193. return construct_unknown()!
  194. else:
  195. log("ERROR (2): did not understand command " + cast_e2s(elem))
  196. output("ERROR: compiled code not understood: " + cast_e2s(elem))
  197. return read_root()!
  198. Action function construct_if():
  199. Action this_element
  200. this_element = create_value(!if)
  201. dict_add_fast(this_element, "cond", construct_unknown())
  202. dict_add_fast(this_element, "then", construct_unknown())
  203. if (input()):
  204. dict_add_fast(this_element, "else", construct_unknown())
  205. if (input()):
  206. dict_add_fast(this_element, "next", construct_unknown())
  207. return this_element!
  208. Action function construct_while():
  209. Action this_element
  210. this_element = create_value(!while)
  211. dict_add_fast(this_element, "cond", construct_unknown())
  212. list_append(while_stack, this_element)
  213. dict_add_fast(this_element, "body", construct_unknown())
  214. list_delete(while_stack, list_len(while_stack) - 1)
  215. if (input()):
  216. dict_add_fast(this_element, "next", construct_unknown())
  217. return this_element!
  218. Action function construct_access():
  219. Action this_element
  220. this_element = create_value(!access)
  221. dict_add_fast(this_element, "var", construct_unknown())
  222. return this_element!
  223. Action function construct_resolve():
  224. Action this_element
  225. Element linked_element
  226. String name
  227. this_element = create_value(!resolve)
  228. name = input()
  229. if dict_in(variable_map, name):
  230. linked_element = variable_map[name]
  231. else:
  232. linked_element = name
  233. dict_add_fast(this_element, "var", linked_element)
  234. return this_element!
  235. Action function construct_assign():
  236. Action this_element
  237. this_element = create_value(!assign)
  238. dict_add_fast(this_element, "var", construct_unknown())
  239. dict_add_fast(this_element, "value", construct_unknown())
  240. if (input()):
  241. dict_add_fast(this_element, "next", construct_unknown())
  242. return this_element!
  243. Action function construct_call():
  244. Action this_element
  245. this_element = create_value(!call)
  246. dict_add_fast(this_element, "func", construct_unknown())
  247. Integer nrParams
  248. nrParams = input()
  249. Integer counter
  250. counter = 0
  251. Element param
  252. Element prev_param
  253. String arg_names_call
  254. arg_names_call = "abcdefghijklmnopqrstuvwxyz"
  255. while (counter < nrParams):
  256. param = create_node()
  257. dict_add_fast(param, "name", string_get(arg_names_call, counter))
  258. dict_add_fast(param, "value", construct_unknown())
  259. if (counter == 0):
  260. dict_add_fast(this_element, "params", param)
  261. else:
  262. dict_add_fast(prev_param, "next_param", param)
  263. prev_param = param
  264. counter = counter + 1
  265. if (nrParams > 0):
  266. dict_add_fast(this_element, "last_param", prev_param)
  267. if (input()):
  268. dict_add_fast(this_element, "next", construct_unknown())
  269. return this_element!
  270. Action function construct_return():
  271. if (input()):
  272. Action this_element
  273. this_element = create_value(!return)
  274. dict_add_fast(this_element, "value", construct_unknown())
  275. return this_element!
  276. else:
  277. return create_value(!return)!
  278. Action function construct_const():
  279. Action this_element
  280. this_element = create_value(!constant)
  281. dict_add_fast(this_element, "node", input())
  282. return this_element!
  283. Action function construct_declare():
  284. Action this_element
  285. Element declared_element
  286. String name
  287. this_element = create_value(!declare)
  288. declared_element = create_node()
  289. dict_add_fast(this_element, "var", declared_element)
  290. name = input()
  291. dict_add_fast(variable_map, name, declared_element)
  292. // Assign value
  293. String op
  294. op = input()
  295. if (op != "none"):
  296. Action assign
  297. Action resolve
  298. Action value
  299. assign = create_value(!assign)
  300. dict_add_fast(this_element, "next", assign)
  301. resolve = create_value(!resolve)
  302. dict_add_fast(assign, "var", resolve)
  303. dict_add_fast(resolve, "var", declared_element)
  304. if (op == "deref"):
  305. value = create_value(!constant)
  306. dict_add_fast(value, "node", import_node(input()))
  307. elif (op == "empty"):
  308. value = create_value(!call)
  309. Element res
  310. Element acc
  311. res = create_value(!resolve)
  312. acc = create_value(!access)
  313. dict_add_fast(value, "func", acc)
  314. dict_add_fast(acc, "var", res)
  315. dict_add_fast(res, "var", "create_node")
  316. elif (op == "const"):
  317. value = create_value(!constant)
  318. dict_add_fast(value, "node", input())
  319. dict_add_fast(assign, "value", value)
  320. if (input()):
  321. dict_add_fast(assign, "next", construct_unknown())
  322. else:
  323. if (input()):
  324. dict_add_fast(this_element, "next", construct_unknown())
  325. return this_element!
  326. Action function construct_input():
  327. Action this_element
  328. this_element = create_value(!input)
  329. return this_element!
  330. Action function construct_output():
  331. Action this_element
  332. this_element = create_value(!output)
  333. dict_add_fast(this_element, "value", construct_unknown())
  334. if (input()):
  335. dict_add_fast(this_element, "next", construct_unknown())
  336. return this_element!
  337. Action function construct_deref():
  338. Action this_element
  339. this_element = create_value(!constant)
  340. dict_add_fast(this_element, "node", import_node(input()))
  341. return this_element!
  342. Action function construct_break():
  343. Action this_element
  344. this_element = create_value(!break)
  345. dict_add_fast(this_element, "while", while_stack[list_len(while_stack) - 1])
  346. return this_element!
  347. Action function construct_continue():
  348. Action this_element
  349. this_element = create_value(!continue)
  350. dict_add_fast(this_element, "while", while_stack[list_len(while_stack) - 1])
  351. return this_element!