constructors.alc 8.2 KB

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