constructors.alc 7.9 KB

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