Year 2 compilers coureswork

list.c 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "list.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. BLIST* create_list(BIND *binding, BLIST *second) {
  6. BLIST *head = (BLIST*) malloc(sizeof(BLIST));
  7. if (head == NULL) {
  8. perror("Failed to create list: ");
  9. exit(1);
  10. }
  11. head->binding = binding;
  12. head->next = second;
  13. return head;
  14. }
  15. ENV* create_new_function_env(ENV* env) {
  16. ENV* n_env = (ENV*) malloc(sizeof(ENV));
  17. if (n_env == NULL) {
  18. perror("Failed to create environment");
  19. exit(1);
  20. }
  21. n_env->bindings = NULL;
  22. n_env->parent = env;
  23. return n_env;
  24. }
  25. BIND* create_binding(TOKEN* name, NODE* tree, ENV* env_ptr) {
  26. BIND* n_bind = (BIND*) malloc(sizeof(BIND));
  27. if (n_bind == NULL) {
  28. perror("Failed to create binding: ");
  29. exit(1);
  30. }
  31. n_bind->name = name;
  32. n_bind->tree = tree;
  33. n_bind->env = env_ptr;
  34. return n_bind;
  35. }
  36. void append_list(BLIST *head, BIND *binding) {
  37. BLIST *ptr = head;
  38. while (ptr->next != NULL) {
  39. ptr = ptr->next;
  40. }
  41. ptr->next = create_list(binding, NULL);
  42. }
  43. BIND* find_name_in_list(TOKEN* name, BLIST *head) {
  44. BLIST *ptr = head;
  45. while (ptr != NULL) {
  46. if (ptr->binding->name == name) {
  47. return ptr->binding;
  48. }
  49. ptr = ptr->next;
  50. }
  51. return NULL;
  52. }
  53. BIND* find_name_in_env(TOKEN* name, ENV* env) {
  54. BIND* ptr = NULL;
  55. ENV* env_ptr = env;
  56. while (env_ptr != NULL &&
  57. (ptr = find_name_in_list(name, env_ptr->bindings)) == NULL) env_ptr = env_ptr->parent;
  58. return ptr;
  59. }