constructors.alc 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  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. Element linked_element
  154. String name
  155. this_element = create_value(!resolve)
  156. name = input()
  157. if dict_in(variable_map, name):
  158. linked_element = variable_map[name]
  159. else:
  160. linked_element = name
  161. dict_add(this_element, "var", linked_element)
  162. return this_element
  163. Action function construct_assign():
  164. Action this_element
  165. this_element = create_value(!assign)
  166. dict_add(this_element, "var", construct_unknown())
  167. dict_add(this_element, "value", construct_unknown())
  168. if (input()):
  169. dict_add(this_element, "next", construct_unknown())
  170. return this_element
  171. Action function construct_call():
  172. Action this_element
  173. this_element = create_value(!call)
  174. dict_add(this_element, "func", construct_unknown())
  175. Integer nrParams
  176. nrParams = input()
  177. Integer counter
  178. counter = 0
  179. Element param
  180. Element prev_param
  181. String arg_names_call
  182. arg_names_call = "abcdefghijklmnopqrstuvwxyz"
  183. while (counter < nrParams):
  184. param = create_node()
  185. dict_add(param, "name", string_get(arg_names_call, counter))
  186. dict_add(param, "value", construct_unknown())
  187. if (counter == 0):
  188. dict_add(this_element, "params", param)
  189. else:
  190. dict_add(prev_param, "next_param", param)
  191. prev_param = param
  192. counter = counter + 1
  193. if (nrParams > 0):
  194. dict_add(this_element, "last_param", prev_param)
  195. if (input()):
  196. dict_add(this_element, "next", construct_unknown())
  197. return this_element
  198. Action function construct_return():
  199. if (input()):
  200. Action this_element
  201. this_element = create_value(!return)
  202. dict_add(this_element, "value", construct_unknown())
  203. return this_element
  204. else:
  205. return create_value(!return)
  206. Action function construct_const():
  207. Action this_element
  208. this_element = create_value(!constant)
  209. dict_add(this_element, "node", input())
  210. return this_element
  211. Action function construct_declare():
  212. Action this_element
  213. Element declared_element
  214. String name
  215. this_element = create_value(!declare)
  216. declared_element = create_node()
  217. dict_add(this_element, "var", declared_element)
  218. name = input()
  219. dict_add(variable_map, name, declared_element)
  220. if (input()):
  221. dict_add(this_element, "next", construct_unknown())
  222. return this_element
  223. Action function construct_input():
  224. Action this_element
  225. this_element = create_value(!input)
  226. return this_element
  227. Action function construct_output():
  228. Action this_element
  229. this_element = create_value(!output)
  230. dict_add(this_element, "value", construct_unknown())
  231. if (input()):
  232. dict_add(this_element, "next", construct_unknown())
  233. return this_element
  234. Action function construct_deref():
  235. Action this_element
  236. this_element = create_value(!constant)
  237. dict_add(this_element, "node", import_node(input()))
  238. return this_element
  239. Action function construct_break():
  240. Action this_element
  241. this_element = create_value(!break)
  242. dict_add(this_element, "while", while_stack[list_len(while_stack) - 1])
  243. return this_element
  244. Action function construct_continue():
  245. Action this_element
  246. this_element = create_value(!continue)
  247. dict_add(this_element, "while", while_stack[list_len(while_stack) - 1])
  248. return this_element
  249. Action function construct_function():
  250. Action func
  251. Integer nrParams
  252. Integer counter
  253. Element param
  254. Element params
  255. String arg_names_decl
  256. while (value_neq(input(), "funcdef")):
  257. // We skip over everything that is not a funcdef, as these are all just definitions of global stuff
  258. log("Skip over input!")
  259. // Consume the name
  260. input()
  261. params = create_node()
  262. nrParams = input()
  263. counter = 0
  264. func = create_node()
  265. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  266. dict_add(func, "params", params)
  267. while (counter < nrParams):
  268. param = create_node()
  269. dict_add(params, string_get(arg_names_decl, counter), param)
  270. dict_add(variable_map, input(), param)
  271. // Output each parameter in turn
  272. counter = counter + 1
  273. // Now add the body
  274. dict_add(func, "body", construct_unknown())
  275. // Consume the final 'false', to indicate that no additional code will come
  276. input()
  277. return func