constructors.alc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. include "primitives.alh"
  2. include "conformance_scd.alh"
  3. include "library.alh"
  4. include "io.alh"
  5. Element while_stack = ?
  6. Action 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. Action function construct_top_global():
  16. Action 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. Action assign
  24. Action resolve
  25. Action 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. Action function construct_top_funcdef():
  44. Action assign
  45. Action resolve
  46. Action constant
  47. Element formal
  48. Element func
  49. Element params
  50. Action 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. Action 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 == "funcdef"):
  107. return construct_funcdef()
  108. elif (elem == "output"):
  109. return construct_output()
  110. elif (elem == "input"):
  111. return construct_input()
  112. elif (elem == "deref"):
  113. return construct_deref()
  114. elif (elem == "break"):
  115. return construct_break()
  116. elif (elem == "continue"):
  117. return construct_continue()
  118. elif (elem == "model"):
  119. return construct_model()
  120. else:
  121. log("ERROR: did not understand command " + cast_e2s(elem))
  122. Void function construct_model():
  123. String command
  124. while(True):
  125. command = input()
  126. if (command == "instantiate_model"):
  127. // TODO
  128. elif (command == "instantiate_bottom"):
  129. // TODO
  130. elif (command == "add_node"):
  131. // TODO
  132. elif (command == "add_edge"):
  133. // TODO
  134. elif (command == "add_value"):
  135. // TODO
  136. elif (command == "add_element"):
  137. // TODO
  138. elif (command == "add_attribute"):
  139. // TODO
  140. elif (command == "add_link"):
  141. // TODO
  142. elif (command == "retype"):
  143. // TODO
  144. elif (command == "code"):
  145. return construct_unknown()
  146. else:
  147. log("Model command not understood: " + command)
  148. Action function construct_if():
  149. Action this_element
  150. this_element = create_value(!if)
  151. dict_add(this_element, "cond", construct_unknown())
  152. dict_add(this_element, "then", construct_unknown())
  153. if (input()):
  154. dict_add(this_element, "else", construct_unknown())
  155. if (input()):
  156. dict_add(this_element, "next", construct_unknown())
  157. return this_element
  158. Action function construct_while():
  159. Action this_element
  160. this_element = create_value(!while)
  161. dict_add(this_element, "cond", construct_unknown())
  162. list_append(while_stack, this_element)
  163. dict_add(this_element, "body", construct_unknown())
  164. list_delete(while_stack, list_len(while_stack) - 1)
  165. if (input()):
  166. dict_add(this_element, "next", construct_unknown())
  167. return this_element
  168. Action function construct_access():
  169. Action this_element
  170. this_element = create_value(!access)
  171. dict_add(this_element, "var", construct_unknown())
  172. return this_element
  173. Action function construct_resolve():
  174. Action this_element
  175. this_element = create_value(!resolve)
  176. dict_add(this_element, "var", input())
  177. return this_element
  178. Action function construct_assign():
  179. Action this_element
  180. this_element = create_value(!assign)
  181. dict_add(this_element, "var", construct_unknown())
  182. dict_add(this_element, "value", construct_unknown())
  183. if (input()):
  184. dict_add(this_element, "next", construct_unknown())
  185. return this_element
  186. Action function construct_call():
  187. Action this_element
  188. this_element = create_value(!call)
  189. dict_add(this_element, "func", construct_unknown())
  190. Integer nrParams
  191. nrParams = input()
  192. Integer counter
  193. counter = 0
  194. Element param
  195. Element prev_param
  196. String arg_names_call
  197. arg_names_call = "abcdefghijklmnopqrstuvwxyz"
  198. while (counter < nrParams):
  199. param = create_node()
  200. dict_add(param, "name", string_get(arg_names_call, counter))
  201. dict_add(param, "value", construct_unknown())
  202. if (counter == 0):
  203. dict_add(this_element, "params", param)
  204. else:
  205. dict_add(prev_param, "next_param", param)
  206. prev_param = param
  207. counter = counter + 1
  208. if (nrParams > 0):
  209. dict_add(this_element, "last_param", prev_param)
  210. if (input()):
  211. dict_add(this_element, "next", construct_unknown())
  212. return this_element
  213. Action function construct_return():
  214. if (input()):
  215. Action this_element
  216. this_element = create_value(!return)
  217. dict_add(this_element, "value", construct_unknown())
  218. return this_element
  219. else:
  220. return create_value(!return)
  221. Action function construct_const():
  222. Action this_element
  223. this_element = create_value(!constant)
  224. dict_add(this_element, "node", input())
  225. return this_element
  226. Action function construct_declare():
  227. Action this_element
  228. Element declared_element
  229. this_element = create_value(!declare)
  230. declared_element = create_node()
  231. dict_add(this_element, "var", declared_element)
  232. output(declared_element)
  233. if (input()):
  234. dict_add(this_element, "next", construct_unknown())
  235. return this_element
  236. Action function construct_input():
  237. Action this_element
  238. this_element = create_value(!input)
  239. return this_element
  240. Action function construct_output():
  241. Action this_element
  242. this_element = create_value(!output)
  243. dict_add(this_element, "value", construct_unknown())
  244. if (input()):
  245. dict_add(this_element, "next", construct_unknown())
  246. return this_element
  247. Action function construct_deref():
  248. Action this_element
  249. this_element = create_value(!constant)
  250. dict_add(this_element, "node", import_node(input()))
  251. return this_element
  252. Action function construct_funcdef():
  253. Action assign
  254. Action resolve
  255. Action constant
  256. Element formal
  257. Action func
  258. Element params
  259. assign = create_value(!assign)
  260. resolve = create_value(!resolve)
  261. constant = create_value(!constant)
  262. formal = input()
  263. func = create_node()
  264. params = create_node()
  265. dict_add(assign, "var", resolve)
  266. dict_add(assign, "value", constant)
  267. dict_add(resolve, "var", formal)
  268. dict_add(constant, "node", func)
  269. dict_add(func, "params", params)
  270. Integer nrParams
  271. nrParams = input()
  272. Integer counter
  273. counter = 0
  274. Element param
  275. String arg_names_decl
  276. arg_names_decl = "abcdefghijklmnopqrstuvwxyz"
  277. while (counter < nrParams):
  278. param = create_node()
  279. dict_add(params, string_get(arg_names_decl, counter), param)
  280. output(param)
  281. // Output each parameter in turn
  282. counter = counter + 1
  283. // Now add the body
  284. dict_add(func, "body", construct_unknown())
  285. if (input()):
  286. dict_add(assign, "next", construct_unknown())
  287. return assign
  288. Action function construct_break():
  289. Action this_element
  290. this_element = create_value(!break)
  291. dict_add(this_element, "while", while_stack[list_len(while_stack) - 1])
  292. return this_element
  293. Action function construct_continue():
  294. Action this_element
  295. this_element = create_value(!continue)
  296. dict_add(this_element, "while", while_stack[list_len(while_stack) - 1])
  297. return this_element
  298. Element function instantiate_bottom(model : Element):
  299. Element this_element
  300. String bottom_type
  301. bottom_type = input()
  302. String element_name
  303. element_name = input()
  304. // Find out which kind of element we want to create
  305. if (bottom_type == "node"):
  306. instantiate_bottom_node(model, element_name)
  307. elif (bottom_type == "value"):
  308. instantiate_bottom_value(model, element_name, input())
  309. elif (bottom_type == "edge"):
  310. instantiate_bottom_edge(model, element_name, model["model"][input()], model["model"][input()])
  311. // If there is more to come, we also add these elements
  312. if (input()):
  313. return instantiate_bottom(model)
  314. else:
  315. return model
  316. Void function instantiate_model(model : Element):
  317. Element type
  318. type = model["metamodel"]["model"][input()]
  319. String name
  320. name = input()
  321. Element params
  322. params = create_node()
  323. if (is_edge(type)):
  324. list_append(params, model["model"][input()])
  325. list_append(params, model["model"][input()])
  326. elif (has_value(type)):
  327. list_append(params, input())
  328. Element attribute_types
  329. attribute_types = create_node()
  330. while (input()):
  331. dict_add(attribute_types, input(), input())
  332. Element attribute_instances
  333. attribute_instances = create_node()
  334. while (input()):
  335. dict_add(attribute_instances, input(), input())
  336. instantiate_model_lib(model, type, name, params, attribute_types, attribute_instances)
  337. if (input()):
  338. instantiate_model(model)
  339. return
  340. Element function retype_model(model : Element):
  341. Element metamodel
  342. metamodel = input()
  343. Element inheritance
  344. inheritance = dict_read(dict_read(input(), "model"), input())
  345. Element mapping
  346. mapping = create_node()
  347. while (input()):
  348. dict_add(mapping, model["model"][input()], metamodel["model"][input()])
  349. return retype(model, metamodel, inheritance, mapping)
  350. Element function find_attribute(source : Element, attr_name : String, types : Element, inheritance_link : Element):
  351. if (dict_in(source, attr_name)):
  352. return source
  353. else:
  354. Integer counter
  355. Integer i
  356. Element edge
  357. counter = read_nr_out(source)
  358. i = 0
  359. while (i < counter):
  360. edge = read_out(source, i)
  361. if (element_eq(dict_read_node(types, edge), inheritance_link)):
  362. return find_attribute(read_edge_dst(edge), attr_name, types, inheritance_link)
  363. i = i + 1
  364. // No return at the moment, as this crashes the MvK
  365. log("ERROR: could not find attribute")