constructors.alc 8.5 KB

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