constructors.alc 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  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 == "output"):
  108. return construct_output()
  109. elif (elem == "input"):
  110. return construct_input()
  111. elif (elem == "deref"):
  112. return construct_deref()
  113. elif (elem == "break"):
  114. return construct_break()
  115. elif (elem == "continue"):
  116. return construct_continue()
  117. elif (elem == "model"):
  118. construct_model()
  119. log("Constructed model")
  120. return construct_unknown()
  121. else:
  122. log("ERROR: did not understand command " + cast_e2s(elem))
  123. Action function construct_if():
  124. Action this_element
  125. this_element = create_value(!if)
  126. dict_add(this_element, "cond", construct_unknown())
  127. dict_add(this_element, "then", construct_unknown())
  128. if (input()):
  129. dict_add(this_element, "else", construct_unknown())
  130. if (input()):
  131. dict_add(this_element, "next", construct_unknown())
  132. return this_element
  133. Action function construct_while():
  134. Action this_element
  135. this_element = create_value(!while)
  136. dict_add(this_element, "cond", construct_unknown())
  137. list_append(while_stack, this_element)
  138. dict_add(this_element, "body", construct_unknown())
  139. list_delete(while_stack, list_len(while_stack) - 1)
  140. if (input()):
  141. dict_add(this_element, "next", construct_unknown())
  142. return this_element
  143. Action function construct_access():
  144. Action this_element
  145. this_element = create_value(!access)
  146. dict_add(this_element, "var", construct_unknown())
  147. return this_element
  148. Action function construct_resolve():
  149. Action this_element
  150. this_element = create_value(!resolve)
  151. dict_add(this_element, "var", input())
  152. return this_element
  153. Action function construct_assign():
  154. Action this_element
  155. this_element = create_value(!assign)
  156. dict_add(this_element, "var", construct_unknown())
  157. dict_add(this_element, "value", construct_unknown())
  158. if (input()):
  159. dict_add(this_element, "next", construct_unknown())
  160. return this_element
  161. Action function construct_call():
  162. Action this_element
  163. this_element = create_value(!call)
  164. dict_add(this_element, "func", construct_unknown())
  165. Integer nrParams
  166. nrParams = input()
  167. Integer counter
  168. counter = 0
  169. Element param
  170. Element prev_param
  171. String arg_names_call
  172. arg_names_call = "abcdefghijklmnopqrstuvwxyz"
  173. while (counter < nrParams):
  174. param = create_node()
  175. dict_add(param, "name", string_get(arg_names_call, counter))
  176. dict_add(param, "value", construct_unknown())
  177. if (counter == 0):
  178. dict_add(this_element, "params", param)
  179. else:
  180. dict_add(prev_param, "next_param", param)
  181. prev_param = param
  182. counter = counter + 1
  183. if (nrParams > 0):
  184. dict_add(this_element, "last_param", prev_param)
  185. if (input()):
  186. dict_add(this_element, "next", construct_unknown())
  187. return this_element
  188. Action function construct_return():
  189. if (input()):
  190. Action this_element
  191. this_element = create_value(!return)
  192. dict_add(this_element, "value", construct_unknown())
  193. return this_element
  194. else:
  195. return create_value(!return)
  196. Action function construct_const():
  197. Action this_element
  198. this_element = create_value(!constant)
  199. dict_add(this_element, "node", input())
  200. return this_element
  201. Action function construct_declare():
  202. Action this_element
  203. Element declared_element
  204. this_element = create_value(!declare)
  205. declared_element = create_node()
  206. dict_add(this_element, "var", declared_element)
  207. output(declared_element)
  208. if (input()):
  209. dict_add(this_element, "next", construct_unknown())
  210. return this_element
  211. Action function construct_input():
  212. Action this_element
  213. this_element = create_value(!input)
  214. return this_element
  215. Action function construct_output():
  216. Action this_element
  217. this_element = create_value(!output)
  218. dict_add(this_element, "value", construct_unknown())
  219. if (input()):
  220. dict_add(this_element, "next", construct_unknown())
  221. return this_element
  222. Action function construct_deref():
  223. Action this_element
  224. this_element = create_value(!constant)
  225. dict_add(this_element, "node", import_node(input()))
  226. return this_element
  227. Action function construct_break():
  228. Action this_element
  229. this_element = create_value(!break)
  230. dict_add(this_element, "while", while_stack[list_len(while_stack) - 1])
  231. return this_element
  232. Action function construct_continue():
  233. Action this_element
  234. this_element = create_value(!continue)
  235. dict_add(this_element, "while", while_stack[list_len(while_stack) - 1])
  236. return this_element
  237. Action function construct_function():
  238. Action func
  239. Integer nrParams
  240. Integer counter
  241. Element param
  242. Element params
  243. String arg_names_decl
  244. params = create_node()
  245. nrParams = input()
  246. counter = 0
  247. func = create_node()
  248. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  249. dict_add(func, "params", params)
  250. while (counter < nrParams):
  251. param = create_node()
  252. dict_add(params, string_get(arg_names_decl, counter), param)
  253. output(param)
  254. // Output each parameter in turn
  255. counter = counter + 1
  256. // Now add the body
  257. dict_add(func, "body", construct_unknown())
  258. return func