constructors.alc 13 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. Element elem2
  8. elem2 = input()
  9. if (string_eq(elem2, "global")):
  10. return construct_top_global()
  11. elif (string_eq(elem2, "funcdef")):
  12. return construct_top_funcdef()
  13. else:
  14. log(string_join("ERROR: did not understand command ", cast_e2s(elem2)))
  15. Element function construct_top_global():
  16. Element this_element_tg
  17. String declared_element_tg
  18. String op_tg
  19. this_element_tg = create_value(!global)
  20. declared_element_tg = input()
  21. dict_add(this_element_tg, "var", declared_element_tg)
  22. // Defines
  23. Element assign_tg
  24. Element resolve_tg
  25. Element value_tg
  26. assign_tg = create_value(!assign)
  27. dict_add(this_element_tg, "next", assign_tg)
  28. resolve_tg = create_value(!resolve)
  29. dict_add(assign_tg, "var", resolve_tg)
  30. dict_add(resolve_tg, "var", declared_element_tg)
  31. op_tg = input()
  32. value_tg = create_value(!constant)
  33. if (string_eq(op_tg, "deref")):
  34. dict_add(value_tg, "node", import_node(input()))
  35. elif (string_eq(op_tg, "empty")):
  36. dict_add(value_tg, "node", create_node())
  37. elif (string_eq(op_tg, "const")):
  38. dict_add(value_tg, "node", input())
  39. dict_add(assign_tg, "value", value_tg)
  40. if (input()):
  41. dict_add(assign_tg, "next", construct_top())
  42. return this_element_tg
  43. Element function construct_top_funcdef():
  44. Element funcdef_assign_top
  45. Element funcdef_resolve_top
  46. Element funcdef_constant_top
  47. Element funcdef_formal_top
  48. Element funcdef_func_top
  49. Element funcdef_params_top
  50. Element funcdef_global_top
  51. funcdef_global_top = create_value(!global)
  52. funcdef_assign_top = create_value(!assign)
  53. funcdef_resolve_top = create_value(!resolve)
  54. funcdef_constant_top = create_value(!constant)
  55. funcdef_formal_top = input()
  56. funcdef_func_top = create_node()
  57. funcdef_params_top = create_node()
  58. dict_add(funcdef_global_top, "var", funcdef_formal_top)
  59. dict_add(funcdef_global_top, "next", funcdef_assign_top)
  60. dict_add(funcdef_assign_top, "var", funcdef_resolve_top)
  61. dict_add(funcdef_assign_top, "value", funcdef_constant_top)
  62. dict_add(funcdef_resolve_top, "var", funcdef_formal_top)
  63. dict_add(funcdef_constant_top, "node", funcdef_func_top)
  64. dict_add(funcdef_func_top, "params", funcdef_params_top)
  65. Integer funcdef_nrParams_top
  66. funcdef_nrParams_top = input()
  67. Integer funcdef_counter_top
  68. funcdef_counter_top = 0
  69. Element funcdef_param_top
  70. String arg_names_decl_top
  71. arg_names_decl_top = "abcdefghijklmnopqrstuvwxyz"
  72. while (integer_lt(funcdef_counter_top, funcdef_nrParams_top)):
  73. funcdef_param_top = create_node()
  74. dict_add(funcdef_params_top, string_get(arg_names_decl_top, funcdef_counter_top), funcdef_param_top)
  75. output(funcdef_param_top)
  76. // Output each parameter in turn
  77. funcdef_counter_top = integer_addition(funcdef_counter_top, 1)
  78. // Now add the body
  79. dict_add(funcdef_func_top, "body", construct_unknown())
  80. if (input()):
  81. dict_add(funcdef_assign_top, "next", construct_top())
  82. return funcdef_global_top
  83. Element function construct_unknown():
  84. String elem
  85. Element new_model
  86. Element new_model_model
  87. elem = input()
  88. if (string_eq(elem, "if")):
  89. return construct_if()
  90. elif (string_eq(elem, "while")):
  91. return construct_while()
  92. elif (string_eq(elem, "access")):
  93. return construct_access()
  94. elif (string_eq(elem, "resolve")):
  95. return construct_resolve()
  96. elif (string_eq(elem, "assign")):
  97. return construct_assign()
  98. elif (string_eq(elem, "call")):
  99. return construct_call()
  100. elif (string_eq(elem, "return")):
  101. return construct_return()
  102. elif (string_eq(elem, "const")):
  103. return construct_const()
  104. elif (string_eq(elem, "declare")):
  105. return construct_declare()
  106. elif (string_eq(elem, "global")):
  107. return construct_global()
  108. elif (string_eq(elem, "funcdef")):
  109. return construct_funcdef()
  110. elif (string_eq(elem, "output")):
  111. return construct_output()
  112. elif (string_eq(elem, "input")):
  113. return construct_input()
  114. elif (string_eq(elem, "deref")):
  115. return construct_deref()
  116. elif (string_eq(elem, "break")):
  117. return construct_break()
  118. elif (string_eq(elem, "continue")):
  119. return construct_continue()
  120. elif (string_eq(elem, "tag")):
  121. Element tmp_constructed
  122. tmp_constructed = construct_unknown()
  123. output(tmp_constructed)
  124. return tmp_constructed
  125. elif (string_eq(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 (string_eq(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 (string_eq(elem, "retype_model")):
  137. retype_model(input())
  138. return construct_unknown()
  139. else:
  140. log(string_join("ERROR: did not understand command ", cast_e2s(elem)))
  141. Element function construct_if():
  142. Element this_element_1
  143. this_element_1 = create_value(!if)
  144. dict_add(this_element_1, "cond", construct_unknown())
  145. dict_add(this_element_1, "then", construct_unknown())
  146. if (input()):
  147. dict_add(this_element_1, "else", construct_unknown())
  148. if (input()):
  149. dict_add(this_element_1, "next", construct_unknown())
  150. return this_element_1
  151. Element function construct_while():
  152. Element this_element_2
  153. this_element_2 = create_value(!while)
  154. dict_add(this_element_2, "cond", construct_unknown())
  155. list_append(while_stack, this_element_2)
  156. dict_add(this_element_2, "body", construct_unknown())
  157. list_delete(while_stack, integer_subtraction(list_len(while_stack), 1))
  158. if (input()):
  159. dict_add(this_element_2, "next", construct_unknown())
  160. return this_element_2
  161. Element function construct_access():
  162. Element this_element_3
  163. this_element_3 = create_value(!access)
  164. dict_add(this_element_3, "var", construct_unknown())
  165. return this_element_3
  166. Element function construct_resolve():
  167. Element this_element_4
  168. this_element_4 = create_value(!resolve)
  169. dict_add(this_element_4, "var", input())
  170. return this_element_4
  171. Element function construct_assign():
  172. Element this_element_5
  173. this_element_5 = create_value(!assign)
  174. dict_add(this_element_5, "var", construct_unknown())
  175. dict_add(this_element_5, "value", construct_unknown())
  176. if (input()):
  177. dict_add(this_element_5, "next", construct_unknown())
  178. return this_element_5
  179. Element function construct_call():
  180. Element this_element_6
  181. this_element_6 = create_value(!call)
  182. dict_add(this_element_6, "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 (integer_lt(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 (integer_eq(counter, 0)):
  196. dict_add(this_element_6, "params", param)
  197. else:
  198. dict_add(prev_param, "next_param", param)
  199. prev_param = param
  200. counter = integer_addition(counter, 1)
  201. if (integer_gt(nrParams, 0)):
  202. dict_add(this_element_6, "last_param", prev_param)
  203. if (input()):
  204. dict_add(this_element_6, "next", construct_unknown())
  205. return this_element_6
  206. Element function construct_return():
  207. Element this_element_7
  208. this_element_7 = create_value(!return)
  209. if (input()):
  210. dict_add(this_element_7, "value", construct_unknown())
  211. return this_element_7
  212. Element function construct_const():
  213. Element this_element_8
  214. this_element_8 = create_value(!constant)
  215. dict_add(this_element_8, "node", input())
  216. return this_element_8
  217. Element function construct_declare():
  218. Element this_element_9
  219. Element declared_element_1
  220. this_element_9 = create_value(!declare)
  221. declared_element_1 = create_node()
  222. dict_add(this_element_9, "var", declared_element_1)
  223. output(declared_element_1)
  224. if (input()):
  225. dict_add(this_element_9, "next", construct_unknown())
  226. return this_element_9
  227. // TODO remove global keyword
  228. Element function construct_global():
  229. Element this_element_10
  230. String declared_element_2
  231. this_element_10 = create_value(!global)
  232. declared_element_2 = input()
  233. dict_add(this_element_10, "var", declared_element_2)
  234. if (input()):
  235. dict_add(this_element_10, "next", construct_unknown())
  236. return this_element_10
  237. Element function construct_input():
  238. Element this_element_11
  239. this_element_11 = create_value(!input)
  240. return this_element_11
  241. Element function construct_output():
  242. Element this_element_12
  243. this_element_12 = create_value(!output)
  244. dict_add(this_element_12, "value", construct_unknown())
  245. if (input()):
  246. dict_add(this_element_12, "next", construct_unknown())
  247. return this_element_12
  248. Element function construct_deref():
  249. Element this_element_13
  250. this_element_13 = create_value(!constant)
  251. dict_add(this_element_13, "node", import_node(input()))
  252. return this_element_13
  253. Element function construct_funcdef():
  254. Element funcdef_assign
  255. Element funcdef_resolve
  256. Element funcdef_constant
  257. Element funcdef_formal
  258. Element funcdef_func
  259. Element funcdef_params
  260. funcdef_assign = create_value(!assign)
  261. funcdef_resolve = create_value(!resolve)
  262. funcdef_constant = create_value(!constant)
  263. funcdef_formal = input()
  264. funcdef_func = create_node()
  265. funcdef_params = create_node()
  266. dict_add(funcdef_assign, "var", funcdef_resolve)
  267. dict_add(funcdef_assign, "value", funcdef_constant)
  268. dict_add(funcdef_resolve, "var", funcdef_formal)
  269. dict_add(funcdef_constant, "node", funcdef_func)
  270. dict_add(funcdef_func, "params", funcdef_params)
  271. Integer funcdef_nrParams
  272. funcdef_nrParams = input()
  273. Integer funcdef_counter
  274. funcdef_counter = 0
  275. Element funcdef_param
  276. String arg_names_decl
  277. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  278. while (integer_lt(funcdef_counter, funcdef_nrParams)):
  279. funcdef_param = create_node()
  280. dict_add(funcdef_params, string_get(arg_names_decl, funcdef_counter), funcdef_param)
  281. output(funcdef_param)
  282. // Output each parameter in turn
  283. funcdef_counter = integer_addition(funcdef_counter, 1)
  284. // Now add the body
  285. dict_add(funcdef_func, "body", construct_unknown())
  286. if (input()):
  287. dict_add(funcdef_assign, "next", construct_unknown())
  288. return funcdef_assign
  289. Element function construct_break():
  290. Element this_element_15
  291. this_element_15 = create_value(!break)
  292. dict_add(this_element_15, "while", dict_read(while_stack, integer_subtraction(list_len(while_stack), 1)))
  293. return this_element_15
  294. Element function construct_continue():
  295. Element this_element_16
  296. this_element_16 = create_value(!continue)
  297. dict_add(this_element_16, "while", dict_read(while_stack, integer_subtraction(list_len(while_stack), 1)))
  298. return this_element_16
  299. Element function instantiate_bottom(model_18 : Element):
  300. Element this_element_18
  301. Element bottom_type
  302. bottom_type = input()
  303. String element_name_18
  304. element_name_18 = input()
  305. // Find out which kind of element we want to create
  306. if (string_eq(bottom_type, "node")):
  307. instantiate_bottom_node(model_18, element_name_18)
  308. elif (string_eq(bottom_type, "value")):
  309. instantiate_bottom_value(model_18, element_name_18, input())
  310. elif (string_eq(bottom_type, "edge")):
  311. instantiate_bottom_edge(model_18, element_name_18, dict_read(dict_read(model_18, "model"), input()), dict_read(dict_read(model_18, "model"), input()))
  312. // If there is more to come, we also add these elements
  313. if (input()):
  314. return instantiate_bottom(model_18)
  315. else:
  316. return model_18
  317. Element function instantiate_model(model_19 : Element):
  318. Element type_19
  319. type_19 = dict_read(dict_read(dict_read(model_19, "metamodel"), "model"), input())
  320. Element name_19
  321. name_19 = input()
  322. Element params_19
  323. params_19 = create_node()
  324. if (is_edge(type_19)):
  325. list_append(params_19, dict_read(dict_read(model_19, "model"), input()))
  326. list_append(params_19, dict_read(dict_read(model_19, "model"), input()))
  327. elif (type_eq(typeof(type_19), Type)):
  328. list_append(params_19, input())
  329. Element attribute_types_19
  330. attribute_types_19 = create_node()
  331. while (input()):
  332. dict_add(attribute_types_19, input(), input())
  333. Element attribute_instances_19
  334. attribute_instances_19 = create_node()
  335. while (input()):
  336. dict_add(attribute_instances_19, input(), input())
  337. instantiate_model_lib(model_19, type_19, name_19, params_19, attribute_types_19, attribute_instances_19)
  338. if (input()):
  339. instantiate_model(model_19)
  340. return 1
  341. Element function retype_model(model_20 : Element):
  342. Element metamodel_20
  343. metamodel_20 = input()
  344. Element inheritance_20
  345. inheritance_20 = dict_read(dict_read(input(), "model"), input())
  346. Element mapping_20
  347. mapping_20 = create_node()
  348. while (input()):
  349. dict_add(mapping_20, dict_read(dict_read(model_20, "model"), input()), dict_read(dict_read(metamodel_20, "model"), input()))
  350. return retype(model_20, metamodel_20, inheritance_20, mapping_20)
  351. Element function find_attribute(source_21 : Element, attr_name_21 : Element, types_21 : Element, inheritance_link_21 : Element):
  352. if (dict_in(source_21, attr_name_21)):
  353. return source_21
  354. else:
  355. Integer counter_21
  356. Integer i
  357. Element edge
  358. counter_21 = read_nr_out(source_21)
  359. i = 0
  360. while (integer_lt(i, counter_21)):
  361. edge = read_out(source_21, i)
  362. if (element_eq(dict_read_node(types_21, edge), inheritance_link_21)):
  363. return find_attribute(read_edge_dst(edge), attr_name_21, types_21, inheritance_link_21)
  364. i = integer_addition(i, 1)
  365. // No return at the moment, as this crashes the MvK