constructors.alc 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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. log("Got main function V: " + cast_e2s(main_function))
  54. log("Got main function S: " + dict_to_string(main_function))
  55. dict_delete(main_function, "body")
  56. dict_add_fast(main_function, "body", first_element)
  57. dict_add_fast(result["end"], "next", prev_element)
  58. return main_function!
  59. Action function construct_global():
  60. Action this_element
  61. String declared_element
  62. String op
  63. this_element = create_value(!global)
  64. declared_element = input()
  65. dict_add_fast(this_element, "var", declared_element)
  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. op = input()
  76. if (op == "deref"):
  77. value = create_value(!constant)
  78. dict_add_fast(value, "node", import_node(input()))
  79. elif (op == "empty"):
  80. value = create_value(!call)
  81. Element res
  82. Element acc
  83. res = create_value(!resolve)
  84. acc = create_value(!access)
  85. dict_add_fast(value, "func", acc)
  86. dict_add_fast(acc, "var", res)
  87. dict_add_fast(res, "var", "create_node")
  88. elif (op == "const"):
  89. value = create_value(!constant)
  90. dict_add_fast(value, "node", input())
  91. dict_add_fast(assign, "value", value)
  92. Element result
  93. result = create_node()
  94. dict_add_fast(result, "name", "")
  95. dict_add_fast(result, "instruction", this_element)
  96. dict_add_fast(result, "start", this_element)
  97. dict_add_fast(result, "end", assign)
  98. return result!
  99. Action function construct_funcdef(mutable : Boolean):
  100. Action assign
  101. Action resolve
  102. Action constant
  103. Element formal
  104. Element func
  105. Element params
  106. Action declare
  107. String name
  108. declare = create_value(!global)
  109. assign = create_value(!assign)
  110. resolve = create_value(!resolve)
  111. constant = create_value(!constant)
  112. name = input()
  113. if (dict_in(variable_map, name)):
  114. formal = dict_read(variable_map, name)
  115. else:
  116. formal = name
  117. func = create_node()
  118. params = create_node()
  119. dict_add_fast(declare, "var", formal)
  120. dict_add_fast(declare, "next", assign)
  121. dict_add_fast(assign, "var", resolve)
  122. dict_add_fast(assign, "value", constant)
  123. dict_add_fast(resolve, "var", formal)
  124. dict_add_fast(constant, "node", func)
  125. dict_add_fast(func, "params", params)
  126. if (mutable):
  127. dict_add_fast(func, "mutable", create_node())
  128. Integer nrParams
  129. nrParams = input()
  130. Integer counter
  131. counter = 0
  132. Element param
  133. String arg_names_decl
  134. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  135. while (counter < nrParams):
  136. param = create_node()
  137. dict_add_fast(params, string_get(arg_names_decl, counter), param)
  138. dict_add_fast(param, "name", string_get(arg_names_decl, counter))
  139. dict_add_fast(variable_map, input(), param)
  140. // Output each parameter in turn
  141. counter = counter + 1
  142. // Now add the body
  143. dict_add_fast(func, "body", construct_unknown())
  144. Element result
  145. result = create_node()
  146. dict_add_fast(result, "name", name)
  147. dict_add_fast(result, "instruction", func)
  148. dict_add_fast(result, "start", declare)
  149. dict_add_fast(result, "end", assign)
  150. return result!
  151. Element function construct_unknown():
  152. String elem
  153. Element new_model
  154. Element new_model_model
  155. elem = input()
  156. if (elem == "if"):
  157. return construct_if()!
  158. elif (elem == "while"):
  159. return construct_while()!
  160. elif (elem == "access"):
  161. return construct_access()!
  162. elif (elem == "resolve"):
  163. return construct_resolve()!
  164. elif (elem == "assign"):
  165. return construct_assign()!
  166. elif (elem == "call"):
  167. return construct_call()!
  168. elif (elem == "return"):
  169. return construct_return()!
  170. elif (elem == "const"):
  171. return construct_const()!
  172. elif (elem == "declare"):
  173. return construct_declare()!
  174. elif (elem == "output"):
  175. return construct_output()!
  176. elif (elem == "input"):
  177. return construct_input()!
  178. elif (elem == "deref"):
  179. return construct_deref()!
  180. elif (elem == "break"):
  181. return construct_break()!
  182. elif (elem == "continue"):
  183. return construct_continue()!
  184. elif (elem == "model"):
  185. construct_model()
  186. return construct_unknown()!
  187. else:
  188. log("ERROR (2): did not understand command " + cast_e2s(elem))
  189. output("ERROR: compiled code not understood: " + cast_e2s(elem))
  190. return read_root()!
  191. Action function construct_if():
  192. Action this_element
  193. this_element = create_value(!if)
  194. dict_add_fast(this_element, "cond", construct_unknown())
  195. dict_add_fast(this_element, "then", construct_unknown())
  196. if (input()):
  197. dict_add_fast(this_element, "else", construct_unknown())
  198. if (input()):
  199. dict_add_fast(this_element, "next", construct_unknown())
  200. return this_element!
  201. Action function construct_while():
  202. Action this_element
  203. this_element = create_value(!while)
  204. dict_add_fast(this_element, "cond", construct_unknown())
  205. list_append(while_stack, this_element)
  206. dict_add_fast(this_element, "body", construct_unknown())
  207. list_delete(while_stack, list_len(while_stack) - 1)
  208. if (input()):
  209. dict_add_fast(this_element, "next", construct_unknown())
  210. return this_element!
  211. Action function construct_access():
  212. Action this_element
  213. this_element = create_value(!access)
  214. dict_add_fast(this_element, "var", construct_unknown())
  215. return this_element!
  216. Action function construct_resolve():
  217. Action this_element
  218. Element linked_element
  219. String name
  220. this_element = create_value(!resolve)
  221. name = input()
  222. if dict_in(variable_map, name):
  223. linked_element = variable_map[name]
  224. else:
  225. linked_element = name
  226. dict_add_fast(this_element, "var", linked_element)
  227. return this_element!
  228. Action function construct_assign():
  229. Action this_element
  230. this_element = create_value(!assign)
  231. dict_add_fast(this_element, "var", construct_unknown())
  232. dict_add_fast(this_element, "value", construct_unknown())
  233. if (input()):
  234. dict_add_fast(this_element, "next", construct_unknown())
  235. return this_element!
  236. Action function construct_call():
  237. Action this_element
  238. this_element = create_value(!call)
  239. dict_add_fast(this_element, "func", construct_unknown())
  240. Integer nrParams
  241. nrParams = input()
  242. Integer counter
  243. counter = 0
  244. Element param
  245. Element prev_param
  246. String arg_names_call
  247. arg_names_call = "abcdefghijklmnopqrstuvwxyz"
  248. while (counter < nrParams):
  249. param = create_node()
  250. dict_add_fast(param, "name", string_get(arg_names_call, counter))
  251. dict_add_fast(param, "value", construct_unknown())
  252. if (counter == 0):
  253. dict_add_fast(this_element, "params", param)
  254. else:
  255. dict_add_fast(prev_param, "next_param", param)
  256. prev_param = param
  257. counter = counter + 1
  258. if (nrParams > 0):
  259. dict_add_fast(this_element, "last_param", prev_param)
  260. if (input()):
  261. dict_add_fast(this_element, "next", construct_unknown())
  262. return this_element!
  263. Action function construct_return():
  264. if (input()):
  265. Action this_element
  266. this_element = create_value(!return)
  267. dict_add_fast(this_element, "value", construct_unknown())
  268. return this_element!
  269. else:
  270. return create_value(!return)!
  271. Action function construct_const():
  272. Action this_element
  273. this_element = create_value(!constant)
  274. dict_add_fast(this_element, "node", input())
  275. return this_element!
  276. Action function construct_declare():
  277. Action this_element
  278. Element declared_element
  279. String name
  280. this_element = create_value(!declare)
  281. declared_element = create_node()
  282. dict_add_fast(this_element, "var", declared_element)
  283. name = input()
  284. dict_add_fast(variable_map, name, declared_element)
  285. if (input()):
  286. dict_add_fast(this_element, "next", construct_unknown())
  287. return this_element!
  288. Action function construct_input():
  289. Action this_element
  290. this_element = create_value(!input)
  291. return this_element!
  292. Action function construct_output():
  293. Action this_element
  294. this_element = create_value(!output)
  295. dict_add_fast(this_element, "value", construct_unknown())
  296. if (input()):
  297. dict_add_fast(this_element, "next", construct_unknown())
  298. return this_element!
  299. Action function construct_deref():
  300. Action this_element
  301. this_element = create_value(!constant)
  302. dict_add_fast(this_element, "node", import_node(input()))
  303. return this_element!
  304. Action function construct_break():
  305. Action this_element
  306. this_element = create_value(!break)
  307. dict_add_fast(this_element, "while", while_stack[list_len(while_stack) - 1])
  308. return this_element!
  309. Action function construct_continue():
  310. Action this_element
  311. this_element = create_value(!continue)
  312. dict_add_fast(this_element, "while", while_stack[list_len(while_stack) - 1])
  313. return this_element!