astree.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "astree.h"
  2. #ifdef TRE_DBG
  3. #define dbg(...) printf("%s: ", __func__), printf(__VA_ARGS__)
  4. #else
  5. #define dbg(...)
  6. #endif
  7. tree_node_t *c_node(char *name, tree_node_t **new_child) {
  8. dbg("Creating Node: %s\n", name);
  9. tree_node_t *node = malloc(sizeof(tree_node_t));
  10. node->type = NONTERMINAL;
  11. node->op_type = NONE;
  12. node->name = name;
  13. node->burm_child[0] = NULL;
  14. node->burm_child[1] = NULL;
  15. for(int i=0; i<MC; i++) {
  16. (node->data.child)[i] = new_child[i];
  17. }
  18. return node;
  19. }
  20. tree_node_t *c_lex(char lexem) {
  21. dbg("Creating lexem Node: %c\n", lexem);
  22. tree_node_t *node = malloc(sizeof(tree_node_t));
  23. node->data.lexem = lexem;
  24. node->type = TERMINAL_LEX;
  25. node->op_type = NONE;
  26. node->name = "LEXEM";
  27. node->burm_child[0] = NULL;
  28. node->burm_child[1] = NULL;
  29. return node;
  30. }
  31. tree_node_t *c_tok(int token) {
  32. dbg("Creating token Node: ");
  33. switch(token) {
  34. case END:
  35. dbg("END\n");
  36. break;
  37. case RETURN:
  38. dbg("RETURN\n");
  39. break;
  40. case GOTO:
  41. dbg("GOTO\n");
  42. break;
  43. case IF:
  44. dbg("IF\n");
  45. break;
  46. case VAR:
  47. dbg("VAR\n");
  48. break;
  49. case AND:
  50. dbg("AND\n");
  51. break;
  52. case NOT:
  53. dbg("NOT\n");
  54. break;
  55. case NEQ:
  56. dbg("NEQ\n");
  57. break;
  58. default:
  59. dbg("ERROR\n");
  60. break;
  61. }
  62. tree_node_t *node = malloc(sizeof(tree_node_t));
  63. node->data.token = token;
  64. node->type = TERMINAL_TOK;
  65. node->op_type = NONE;
  66. node->name = "TOKEN";
  67. node->burm_child[0] = NULL;
  68. node->burm_child[1] = NULL;
  69. return node;
  70. }
  71. tree_node_t *c_id(id_syntax_cb_t syntax_callback, char* name, long line, symbolt_t type) {
  72. dbg("Creating id Node: %s %ld\n", name, line);
  73. tree_node_t *node = malloc(sizeof(tree_node_t));
  74. node->data.id.name = name;
  75. node->data.id.line = line;
  76. node->data.id.type = type;
  77. node->data.id.syntax_cb = syntax_callback;
  78. node->type = TERMINAL_ID;
  79. node->op_type = NONE;
  80. node->name = "ID";
  81. node->burm_child[0] = NULL;
  82. node->burm_child[1] = NULL;
  83. return node;
  84. }
  85. tree_node_t *c_num(long val, long line) {
  86. dbg("Creating num Node: %ld %ld\n", val, line);
  87. tree_node_t *node = malloc(sizeof(tree_node_t));
  88. node->data.num.val = val;
  89. node->data.num.line = line;
  90. node->type = TERMINAL_NUM;
  91. node->op_type = NONE;
  92. node->name = "NUM";
  93. node->burm_child[0] = NULL;
  94. node->burm_child[1] = NULL;
  95. return node;
  96. }