constructors.alc 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  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_top():
  9. String command
  10. while (True):
  11. command = input()
  12. if (command == "global"):
  13. return construct_global()!
  14. elif (command == "funcdef"):
  15. return construct_top_funcdef(False)!
  16. elif (command == "mutable_funcdef"):
  17. return construct_top_funcdef(True)!
  18. else:
  19. log("ERROR (1): did not understand command " + cast_e2s(command))
  20. output("ERROR: compiled code not understood: " + cast_e2s(command))
  21. return read_root()!
  22. Action function construct_global():
  23. Action this_element
  24. String declared_element
  25. String op
  26. this_element = create_value(!global)
  27. declared_element = input()
  28. dict_add_fast(this_element, "var", declared_element)
  29. // Defines
  30. Action assign
  31. Action resolve
  32. Action value
  33. assign = create_value(!assign)
  34. dict_add_fast(this_element, "next", assign)
  35. resolve = create_value(!resolve)
  36. dict_add_fast(assign, "var", resolve)
  37. dict_add_fast(resolve, "var", declared_element)
  38. op = input()
  39. if (op == "deref"):
  40. value = create_value(!constant)
  41. dict_add_fast(value, "node", import_node(input()))
  42. elif (op == "empty"):
  43. value = create_value(!call)
  44. Element res
  45. Element acc
  46. res = create_value(!resolve)
  47. acc = create_value(!access)
  48. dict_add_fast(value, "func", acc)
  49. dict_add_fast(acc, "var", res)
  50. dict_add_fast(res, "var", "create_node")
  51. elif (op == "const"):
  52. value = create_value(!constant)
  53. dict_add_fast(value, "node", input())
  54. dict_add_fast(assign, "value", value)
  55. if (input()):
  56. dict_add_fast(assign, "next", construct_top())
  57. return this_element!
  58. Action function construct_top_funcdef(mutable : Boolean):
  59. Action assign
  60. Action resolve
  61. Action constant
  62. Element formal
  63. Element func
  64. Element params
  65. Action global
  66. String name
  67. global = create_value(!global)
  68. assign = create_value(!assign)
  69. resolve = create_value(!resolve)
  70. constant = create_value(!constant)
  71. name = input()
  72. if (dict_in(variable_map, name)):
  73. formal = dict_read(variable_map, name)
  74. else:
  75. formal = name
  76. func = create_node()
  77. params = create_node()
  78. dict_add_fast(global, "var", formal)
  79. dict_add_fast(global, "next", assign)
  80. dict_add_fast(assign, "var", resolve)
  81. dict_add_fast(assign, "value", constant)
  82. dict_add_fast(resolve, "var", formal)
  83. dict_add_fast(constant, "node", func)
  84. dict_add_fast(func, "params", params)
  85. if (mutable):
  86. dict_add_fast(func, "mutable", create_node())
  87. Integer nrParams
  88. nrParams = input()
  89. Integer counter
  90. counter = 0
  91. Element param
  92. String arg_names_decl
  93. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  94. while (counter < nrParams):
  95. param = create_node()
  96. dict_add_fast(params, string_get(arg_names_decl, counter), param)
  97. dict_add_fast(param, "name", string_get(arg_names_decl, counter))
  98. dict_add_fast(variable_map, input(), param)
  99. // Output each parameter in turn
  100. counter = counter + 1
  101. // Now add the body
  102. dict_add_fast(func, "body", construct_unknown())
  103. if (input()):
  104. dict_add_fast(assign, "next", construct_top())
  105. return global!
  106. Element function construct_unknown():
  107. String elem
  108. Element new_model
  109. Element new_model_model
  110. elem = input()
  111. if (elem == "if"):
  112. return construct_if()!
  113. elif (elem == "while"):
  114. return construct_while()!
  115. elif (elem == "access"):
  116. return construct_access()!
  117. elif (elem == "resolve"):
  118. return construct_resolve()!
  119. elif (elem == "assign"):
  120. return construct_assign()!
  121. elif (elem == "call"):
  122. return construct_call()!
  123. elif (elem == "return"):
  124. return construct_return()!
  125. elif (elem == "const"):
  126. return construct_const()!
  127. elif (elem == "declare"):
  128. return construct_declare()!
  129. elif (elem == "output"):
  130. return construct_output()!
  131. elif (elem == "input"):
  132. return construct_input()!
  133. elif (elem == "deref"):
  134. return construct_deref()!
  135. elif (elem == "break"):
  136. return construct_break()!
  137. elif (elem == "continue"):
  138. return construct_continue()!
  139. elif (elem == "model"):
  140. construct_model()
  141. return construct_unknown()!
  142. else:
  143. log("ERROR (2): did not understand command " + cast_e2s(elem))
  144. output("ERROR: compiled code not understood: " + cast_e2s(elem))
  145. return read_root()!
  146. Action function construct_if():
  147. Action this_element
  148. this_element = create_value(!if)
  149. dict_add_fast(this_element, "cond", construct_unknown())
  150. dict_add_fast(this_element, "then", construct_unknown())
  151. if (input()):
  152. dict_add_fast(this_element, "else", construct_unknown())
  153. if (input()):
  154. dict_add_fast(this_element, "next", construct_unknown())
  155. return this_element!
  156. Action function construct_while():
  157. Action this_element
  158. this_element = create_value(!while)
  159. dict_add_fast(this_element, "cond", construct_unknown())
  160. list_append(while_stack, this_element)
  161. dict_add_fast(this_element, "body", construct_unknown())
  162. list_delete(while_stack, list_len(while_stack) - 1)
  163. if (input()):
  164. dict_add_fast(this_element, "next", construct_unknown())
  165. return this_element!
  166. Action function construct_access():
  167. Action this_element
  168. this_element = create_value(!access)
  169. dict_add_fast(this_element, "var", construct_unknown())
  170. return this_element!
  171. Action function construct_resolve():
  172. Action this_element
  173. Element linked_element
  174. String name
  175. this_element = create_value(!resolve)
  176. name = input()
  177. if dict_in(variable_map, name):
  178. linked_element = variable_map[name]
  179. else:
  180. linked_element = name
  181. dict_add_fast(this_element, "var", linked_element)
  182. return this_element!
  183. Action function construct_assign():
  184. Action this_element
  185. this_element = create_value(!assign)
  186. dict_add_fast(this_element, "var", construct_unknown())
  187. dict_add_fast(this_element, "value", construct_unknown())
  188. if (input()):
  189. dict_add_fast(this_element, "next", construct_unknown())
  190. return this_element!
  191. Action function construct_call():
  192. Action this_element
  193. this_element = create_value(!call)
  194. dict_add_fast(this_element, "func", construct_unknown())
  195. Integer nrParams
  196. nrParams = input()
  197. Integer counter
  198. counter = 0
  199. Element param
  200. Element prev_param
  201. String arg_names_call
  202. arg_names_call = "abcdefghijklmnopqrstuvwxyz"
  203. while (counter < nrParams):
  204. param = create_node()
  205. dict_add_fast(param, "name", string_get(arg_names_call, counter))
  206. dict_add_fast(param, "value", construct_unknown())
  207. if (counter == 0):
  208. dict_add_fast(this_element, "params", param)
  209. else:
  210. dict_add_fast(prev_param, "next_param", param)
  211. prev_param = param
  212. counter = counter + 1
  213. if (nrParams > 0):
  214. dict_add_fast(this_element, "last_param", prev_param)
  215. if (input()):
  216. dict_add_fast(this_element, "next", construct_unknown())
  217. return this_element!
  218. Action function construct_return():
  219. if (input()):
  220. Action this_element
  221. this_element = create_value(!return)
  222. dict_add_fast(this_element, "value", construct_unknown())
  223. return this_element!
  224. else:
  225. return create_value(!return)!
  226. Action function construct_const():
  227. Action this_element
  228. this_element = create_value(!constant)
  229. dict_add_fast(this_element, "node", input())
  230. return this_element!
  231. Action function construct_declare():
  232. Action this_element
  233. Element declared_element
  234. String name
  235. this_element = create_value(!declare)
  236. declared_element = create_node()
  237. dict_add_fast(this_element, "var", declared_element)
  238. name = input()
  239. dict_add_fast(variable_map, name, declared_element)
  240. if (input()):
  241. dict_add_fast(this_element, "next", construct_unknown())
  242. return this_element!
  243. Action function construct_input():
  244. Action this_element
  245. this_element = create_value(!input)
  246. return this_element!
  247. Action function construct_output():
  248. Action this_element
  249. this_element = create_value(!output)
  250. dict_add_fast(this_element, "value", construct_unknown())
  251. if (input()):
  252. dict_add_fast(this_element, "next", construct_unknown())
  253. return this_element!
  254. Action function construct_deref():
  255. Action this_element
  256. this_element = create_value(!constant)
  257. dict_add_fast(this_element, "node", import_node(input()))
  258. return this_element!
  259. Action function construct_break():
  260. Action this_element
  261. this_element = create_value(!break)
  262. dict_add_fast(this_element, "while", while_stack[list_len(while_stack) - 1])
  263. return this_element!
  264. Action function construct_continue():
  265. Action this_element
  266. this_element = create_value(!continue)
  267. dict_add_fast(this_element, "while", while_stack[list_len(while_stack) - 1])
  268. return this_element!
  269. Action function construct_function():
  270. Action func
  271. Integer nrParams
  272. Integer counter
  273. Element param
  274. Element params
  275. String arg_names_decl
  276. String inp
  277. variable_map = create_node()
  278. inp = input()
  279. while (bool_and(inp != "funcdef", inp != "mutable_funcdef")):
  280. // We skip over everything that is not a funcdef, as these are all just definitions of global stuff
  281. inp = input()
  282. // Consume the name
  283. input()
  284. params = create_node()
  285. nrParams = input()
  286. counter = 0
  287. func = create_node()
  288. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  289. dict_add_fast(func, "params", params)
  290. if (inp == "mutable_funcdef"):
  291. dict_add_fast(func, "mutable", create_node())
  292. while (counter < nrParams):
  293. param = create_node()
  294. dict_add_fast(params, string_get(arg_names_decl, counter), param)
  295. dict_add_fast(variable_map, input(), param)
  296. // Output each parameter in turn
  297. counter = counter + 1
  298. // Now add the body
  299. dict_add_fast(func, "body", construct_unknown())
  300. // Consume the final 'false', to indicate that no additional code will come
  301. input()
  302. return func!