constructors.alc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. include "primitives.alh"
  2. include "conformance_scd.alh"
  3. include "library.alh"
  4. include "io.alh"
  5. Element while_stack = ?
  6. Element function construct_top():
  7. String command
  8. command = input()
  9. if (command == "global"):
  10. return construct_top_global()
  11. elif (command == "funcdef"):
  12. return construct_top_funcdef()
  13. else:
  14. log("ERROR: did not understand command " + cast_e2s(command))
  15. Element function construct_top_global():
  16. Element this_element
  17. String declared_element
  18. String op
  19. this_element = create_value(!global)
  20. declared_element = input()
  21. dict_add(this_element, "var", declared_element)
  22. // Defines
  23. Element assign
  24. Element resolve
  25. Element value
  26. assign = create_value(!assign)
  27. dict_add(this_element, "next", assign)
  28. resolve = create_value(!resolve)
  29. dict_add(assign, "var", resolve)
  30. dict_add(resolve, "var", declared_element)
  31. op = input()
  32. value = create_value(!constant)
  33. if (op == "deref"):
  34. dict_add(value, "node", import_node(input()))
  35. elif (op == "empty"):
  36. dict_add(value, "node", create_node())
  37. elif (op == "const"):
  38. dict_add(value, "node", input())
  39. dict_add(assign, "value", value)
  40. if (input()):
  41. dict_add(assign, "next", construct_top())
  42. return this_element
  43. Element function construct_top_funcdef():
  44. Element assign
  45. Element resolve
  46. Element constant
  47. Element formal
  48. Element func
  49. Element params
  50. Element global
  51. global = create_value(!global)
  52. assign = create_value(!assign)
  53. resolve = create_value(!resolve)
  54. constant = create_value(!constant)
  55. formal = input()
  56. func = create_node()
  57. params = create_node()
  58. dict_add(global, "var", formal)
  59. dict_add(global, "next", assign)
  60. dict_add(assign, "var", resolve)
  61. dict_add(assign, "value", constant)
  62. dict_add(resolve, "var", formal)
  63. dict_add(constant, "node", func)
  64. dict_add(func, "params", params)
  65. Integer nrParams
  66. nrParams = input()
  67. Integer counter
  68. counter = 0
  69. Element param
  70. String arg_names_decl
  71. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  72. while (counter < nrParams):
  73. param = create_node()
  74. dict_add(params, string_get(arg_names_decl, counter), param)
  75. output(param)
  76. // Output each parameter in turn
  77. counter = counter + 1
  78. // Now add the body
  79. dict_add(func, "body", construct_unknown())
  80. if (input()):
  81. dict_add(assign, "next", construct_top())
  82. return global
  83. Element function construct_unknown():
  84. String elem
  85. Element new_model
  86. Element new_model_model
  87. elem = input()
  88. if (elem == "if"):
  89. return construct_if()
  90. elif (elem == "while"):
  91. return construct_while()
  92. elif (elem == "access"):
  93. return construct_access()
  94. elif (elem == "resolve"):
  95. return construct_resolve()
  96. elif (elem == "assign"):
  97. return construct_assign()
  98. elif (elem == "call"):
  99. return construct_call()
  100. elif (elem == "return"):
  101. return construct_return()
  102. elif (elem == "const"):
  103. return construct_const()
  104. elif (elem == "declare"):
  105. return construct_declare()
  106. elif (elem == "global"):
  107. return construct_global()
  108. elif (elem == "funcdef"):
  109. return construct_funcdef()
  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 == "tag"):
  121. Element tmp_constructed
  122. tmp_constructed = construct_unknown()
  123. output(tmp_constructed)
  124. return tmp_constructed
  125. elif (elem == "instantiate_bottom"):
  126. new_model = create_node()
  127. dict_add(new_model, "model", create_node())
  128. instantiate_bottom(new_model)
  129. output(new_model)
  130. return construct_unknown()
  131. elif (elem == "instantiate_model"):
  132. new_model = instantiate_new_model(input(), dict_read(dict_read(input(), "model"), input()))
  133. instantiate_model(new_model)
  134. output(new_model)
  135. return construct_unknown()
  136. elif (elem == "retype_model"):
  137. retype_model(input())
  138. return construct_unknown()
  139. else:
  140. log("ERROR: did not understand command " + cast_e2s(elem))
  141. Element function construct_if():
  142. Element this_element
  143. this_element = create_value(!if)
  144. dict_add(this_element, "cond", construct_unknown())
  145. dict_add(this_element, "then", construct_unknown())
  146. if (input()):
  147. dict_add(this_element, "else", construct_unknown())
  148. if (input()):
  149. dict_add(this_element, "next", construct_unknown())
  150. return this_element
  151. Element function construct_while():
  152. Element this_element
  153. this_element = create_value(!while)
  154. dict_add(this_element, "cond", construct_unknown())
  155. list_append(while_stack, this_element)
  156. dict_add(this_element, "body", construct_unknown())
  157. list_delete(while_stack, list_len(while_stack) - 1)
  158. if (input()):
  159. dict_add(this_element, "next", construct_unknown())
  160. return this_element
  161. Element function construct_access():
  162. Element this_element
  163. this_element = create_value(!access)
  164. dict_add(this_element, "var", construct_unknown())
  165. return this_element
  166. Element function construct_resolve():
  167. Element this_element
  168. this_element = create_value(!resolve)
  169. dict_add(this_element, "var", input())
  170. return this_element
  171. Element function construct_assign():
  172. Element this_element
  173. this_element = create_value(!assign)
  174. dict_add(this_element, "var", construct_unknown())
  175. dict_add(this_element, "value", construct_unknown())
  176. if (input()):
  177. dict_add(this_element, "next", construct_unknown())
  178. return this_element
  179. Element function construct_call():
  180. Element this_element
  181. this_element = create_value(!call)
  182. dict_add(this_element, "func", construct_unknown())
  183. Integer nrParams
  184. nrParams = input()
  185. Integer counter
  186. counter = 0
  187. Element param
  188. Element prev_param
  189. String arg_names_call
  190. arg_names_call = "abcdefghijklmnopqrstuvwxyz"
  191. while (counter < nrParams):
  192. param = create_node()
  193. dict_add(param, "name", string_get(arg_names_call, counter))
  194. dict_add(param, "value", construct_unknown())
  195. if (counter == 0):
  196. dict_add(this_element, "params", param)
  197. else:
  198. dict_add(prev_param, "next_param", param)
  199. prev_param = param
  200. counter = counter + 1
  201. if (nrParams > 0):
  202. dict_add(this_element, "last_param", prev_param)
  203. if (input()):
  204. dict_add(this_element, "next", construct_unknown())
  205. return this_element
  206. Element function construct_return():
  207. Element this_element
  208. this_element = create_value(!return)
  209. if (input()):
  210. dict_add(this_element, "value", construct_unknown())
  211. return this_element
  212. Element function construct_const():
  213. Element this_element
  214. this_element = create_value(!constant)
  215. dict_add(this_element, "node", input())
  216. return this_element
  217. Element function construct_declare():
  218. Element this_element
  219. Element declared_element
  220. this_element = create_value(!declare)
  221. declared_element = create_node()
  222. dict_add(this_element, "var", declared_element)
  223. output(declared_element)
  224. if (input()):
  225. dict_add(this_element, "next", construct_unknown())
  226. return this_element
  227. // TODO remove global keyword
  228. Element function construct_global():
  229. Element this_element
  230. String declared_element
  231. this_element = create_value(!global)
  232. declared_element = input()
  233. dict_add(this_element, "var", declared_element)
  234. if (input()):
  235. dict_add(this_element, "next", construct_unknown())
  236. return this_element
  237. Element function construct_input():
  238. Element this_element
  239. this_element = create_value(!input)
  240. return this_element
  241. Element function construct_output():
  242. Element this_element
  243. this_element = create_value(!output)
  244. dict_add(this_element, "value", construct_unknown())
  245. if (input()):
  246. dict_add(this_element, "next", construct_unknown())
  247. return this_element
  248. Element function construct_deref():
  249. Element this_element
  250. this_element = create_value(!constant)
  251. dict_add(this_element, "node", import_node(input()))
  252. return this_element
  253. Element function construct_funcdef():
  254. Element assign
  255. Element resolve
  256. Element constant
  257. Element formal
  258. Element func
  259. Element params
  260. assign = create_value(!assign)
  261. resolve = create_value(!resolve)
  262. constant = create_value(!constant)
  263. formal = input()
  264. func = create_node()
  265. params = create_node()
  266. dict_add(assign, "var", resolve)
  267. dict_add(assign, "value", constant)
  268. dict_add(resolve, "var", formal)
  269. dict_add(constant, "node", func)
  270. dict_add(func, "params", params)
  271. Integer nrParams
  272. nrParams = input()
  273. Integer counter
  274. counter = 0
  275. Element param
  276. String arg_names_decl
  277. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  278. while (counter < nrParams):
  279. param = create_node()
  280. dict_add(params, string_get(arg_names_decl, counter), param)
  281. output(param)
  282. // Output each parameter in turn
  283. counter = counter + 1
  284. // Now add the body
  285. dict_add(func, "body", construct_unknown())
  286. if (input()):
  287. dict_add(assign, "next", construct_unknown())
  288. return assign
  289. Element function construct_break():
  290. Element this_element
  291. this_element = create_value(!break)
  292. dict_add(this_element, "while", dict_read(while_stack, list_len(while_stack) - 1))
  293. return this_element
  294. Element function construct_continue():
  295. Element this_element
  296. this_element = create_value(!continue)
  297. dict_add(this_element, "while", dict_read(while_stack, list_len(while_stack) - 1))
  298. return this_element
  299. Element function instantiate_bottom(model : Element):
  300. Element this_element
  301. String bottom_type
  302. bottom_type = input()
  303. String element_name
  304. element_name = input()
  305. // Find out which kind of element we want to create
  306. if (bottom_type == "node"):
  307. instantiate_bottom_node(model, element_name)
  308. elif (bottom_type == "value"):
  309. instantiate_bottom_value(model, element_name, input())
  310. elif (bottom_type == "edge"):
  311. instantiate_bottom_edge(model, element_name, dict_read(dict_read(model, "model"), input()), dict_read(dict_read(model, "model"), input()))
  312. // If there is more to come, we also add these elements
  313. if (input()):
  314. return instantiate_bottom(model)
  315. else:
  316. return model
  317. Element function instantiate_model(model : Element):
  318. Element type
  319. type = dict_read(dict_read(dict_read(model, "metamodel"), "model"), input())
  320. Element name
  321. name = input()
  322. Element params
  323. params = create_node()
  324. if (is_edge(type)):
  325. list_append(params, dict_read(dict_read(model, "model"), input()))
  326. list_append(params, dict_read(dict_read(model, "model"), input()))
  327. elif (type_eq(typeof(type), Type)):
  328. list_append(params, input())
  329. Element attribute_types
  330. attribute_types = create_node()
  331. while (input()):
  332. dict_add(attribute_types, input(), input())
  333. Element attribute_instances
  334. attribute_instances = create_node()
  335. while (input()):
  336. dict_add(attribute_instances, input(), input())
  337. instantiate_model_lib(model, type, name, params, attribute_types, attribute_instances)
  338. if (input()):
  339. instantiate_model(model)
  340. return 1
  341. Element function retype_model(model : Element):
  342. Element metamodel
  343. metamodel = input()
  344. Element inheritance
  345. inheritance = dict_read(dict_read(input(), "model"), input())
  346. Element mapping
  347. mapping = create_node()
  348. while (input()):
  349. dict_add(mapping, dict_read(dict_read(model, "model"), input()), dict_read(dict_read(metamodel, "model"), input()))
  350. return retype(model, metamodel, inheritance, mapping)
  351. Element function find_attribute(source : Element, attr_name : Element, types : Element, inheritance_link : Element):
  352. if (dict_in(source, attr_name)):
  353. return source
  354. else:
  355. Integer counter
  356. Integer i
  357. Element edge
  358. counter = read_nr_out(source)
  359. i = 0
  360. while (i < counter):
  361. edge = read_out(source, i)
  362. if (element_eq(dict_read_node(types, edge), inheritance_link)):
  363. return find_attribute(read_edge_dst(edge), attr_name, types, inheritance_link)
  364. i = i + 1
  365. // No return at the moment, as this crashes the MvK