constructors.alc 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  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. return construct_unknown()!
  136. else:
  137. log("ERROR: did not understand command " + cast_e2s(elem))
  138. Action function construct_if():
  139. Action this_element
  140. this_element = create_value(!if)
  141. dict_add(this_element, "cond", construct_unknown())
  142. dict_add(this_element, "then", construct_unknown())
  143. if (input()):
  144. dict_add(this_element, "else", construct_unknown())
  145. if (input()):
  146. dict_add(this_element, "next", construct_unknown())
  147. return this_element!
  148. Action function construct_while():
  149. Action this_element
  150. this_element = create_value(!while)
  151. dict_add(this_element, "cond", construct_unknown())
  152. list_append(while_stack, this_element)
  153. dict_add(this_element, "body", construct_unknown())
  154. list_delete(while_stack, list_len(while_stack) - 1)
  155. if (input()):
  156. dict_add(this_element, "next", construct_unknown())
  157. return this_element!
  158. Action function construct_access():
  159. Action this_element
  160. this_element = create_value(!access)
  161. dict_add(this_element, "var", construct_unknown())
  162. return this_element!
  163. Action function construct_resolve():
  164. Action this_element
  165. Element linked_element
  166. String name
  167. this_element = create_value(!resolve)
  168. name = input()
  169. if dict_in(variable_map, name):
  170. linked_element = variable_map[name]
  171. else:
  172. linked_element = name
  173. dict_add(this_element, "var", linked_element)
  174. return this_element!
  175. Action function construct_assign():
  176. Action this_element
  177. this_element = create_value(!assign)
  178. dict_add(this_element, "var", construct_unknown())
  179. dict_add(this_element, "value", construct_unknown())
  180. if (input()):
  181. dict_add(this_element, "next", construct_unknown())
  182. return this_element!
  183. Action function construct_call():
  184. Action this_element
  185. this_element = create_value(!call)
  186. dict_add(this_element, "func", construct_unknown())
  187. Integer nrParams
  188. nrParams = input()
  189. Integer counter
  190. counter = 0
  191. Element param
  192. Element prev_param
  193. String arg_names_call
  194. arg_names_call = "abcdefghijklmnopqrstuvwxyz"
  195. while (counter < nrParams):
  196. param = create_node()
  197. dict_add(param, "name", string_get(arg_names_call, counter))
  198. dict_add(param, "value", construct_unknown())
  199. if (counter == 0):
  200. dict_add(this_element, "params", param)
  201. else:
  202. dict_add(prev_param, "next_param", param)
  203. prev_param = param
  204. counter = counter + 1
  205. if (nrParams > 0):
  206. dict_add(this_element, "last_param", prev_param)
  207. if (input()):
  208. dict_add(this_element, "next", construct_unknown())
  209. return this_element!
  210. Action function construct_return():
  211. if (input()):
  212. Action this_element
  213. this_element = create_value(!return)
  214. dict_add(this_element, "value", construct_unknown())
  215. return this_element!
  216. else:
  217. return create_value(!return)!
  218. Action function construct_const():
  219. Action this_element
  220. this_element = create_value(!constant)
  221. dict_add(this_element, "node", input())
  222. return this_element!
  223. Action function construct_declare():
  224. Action this_element
  225. Element declared_element
  226. String name
  227. this_element = create_value(!declare)
  228. declared_element = create_node()
  229. dict_add(this_element, "var", declared_element)
  230. name = input()
  231. dict_add(variable_map, name, declared_element)
  232. if (input()):
  233. dict_add(this_element, "next", construct_unknown())
  234. return this_element!
  235. Action function construct_input():
  236. Action this_element
  237. this_element = create_value(!input)
  238. return this_element!
  239. Action function construct_output():
  240. Action this_element
  241. this_element = create_value(!output)
  242. dict_add(this_element, "value", construct_unknown())
  243. if (input()):
  244. dict_add(this_element, "next", construct_unknown())
  245. return this_element!
  246. Action function construct_deref():
  247. Action this_element
  248. this_element = create_value(!constant)
  249. dict_add(this_element, "node", import_node(input()))
  250. return this_element!
  251. Action function construct_break():
  252. Action this_element
  253. this_element = create_value(!break)
  254. dict_add(this_element, "while", while_stack[list_len(while_stack) - 1])
  255. return this_element!
  256. Action function construct_continue():
  257. Action this_element
  258. this_element = create_value(!continue)
  259. dict_add(this_element, "while", while_stack[list_len(while_stack) - 1])
  260. return this_element!
  261. Action function construct_function():
  262. Action func
  263. Integer nrParams
  264. Integer counter
  265. Element param
  266. Element params
  267. String arg_names_decl
  268. variable_map = create_node()
  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!