constructors.alc 7.9 KB

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