constructors.alc 8.1 KB

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