constructors.alc 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  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. output(param)
  77. // Output each parameter in turn
  78. counter = counter + 1
  79. // Now add the body
  80. dict_add(func, "body", construct_unknown())
  81. if (input()):
  82. dict_add(assign, "next", construct_top())
  83. return global
  84. Action function construct_unknown():
  85. String elem
  86. Element new_model
  87. Element new_model_model
  88. elem = input()
  89. if (elem == "if"):
  90. return construct_if()
  91. elif (elem == "while"):
  92. return construct_while()
  93. elif (elem == "access"):
  94. return construct_access()
  95. elif (elem == "resolve"):
  96. return construct_resolve()
  97. elif (elem == "assign"):
  98. return construct_assign()
  99. elif (elem == "call"):
  100. return construct_call()
  101. elif (elem == "return"):
  102. return construct_return()
  103. elif (elem == "const"):
  104. return construct_const()
  105. elif (elem == "declare"):
  106. return construct_declare()
  107. elif (elem == "funcdef"):
  108. return construct_funcdef()
  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_funcdef():
  230. Action assign
  231. Action resolve
  232. Action constant
  233. Action func
  234. Element params
  235. assign = create_value(!assign)
  236. resolve = create_value(!resolve)
  237. constant = create_value(!constant)
  238. func = create_node()
  239. params = create_node()
  240. dict_add(assign, "var", resolve)
  241. dict_add(assign, "value", constant)
  242. dict_add(resolve, "var", input())
  243. dict_add(constant, "node", func)
  244. dict_add(func, "params", params)
  245. Integer nrParams
  246. nrParams = input()
  247. Integer counter
  248. counter = 0
  249. Element param
  250. String arg_names_decl
  251. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  252. while (counter < nrParams):
  253. param = create_node()
  254. dict_add(params, string_get(arg_names_decl, counter), param)
  255. output(param)
  256. // Output each parameter in turn
  257. counter = counter + 1
  258. // Now add the body
  259. dict_add(func, "body", construct_unknown())
  260. if (input()):
  261. dict_add(assign, "next", construct_unknown())
  262. return assign
  263. Action function construct_break():
  264. Action this_element
  265. this_element = create_value(!break)
  266. dict_add(this_element, "while", while_stack[list_len(while_stack) - 1])
  267. return this_element
  268. Action function construct_continue():
  269. Action this_element
  270. this_element = create_value(!continue)
  271. dict_add(this_element, "while", while_stack[list_len(while_stack) - 1])
  272. return this_element