token.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "__token.h"
  2. Token *makeToken(long int line) {
  3. Token *tmp = memCalloc(1, sizeof(Token));
  4. tmp->token_type = 0;
  5. tmp->data.str = NULL;
  6. tmp->data.st = NULL;
  7. tmp->data.second_str = NULL;
  8. tmp->line = line;
  9. tmp->next = NULL;
  10. tmp->last = NULL;
  11. return tmp;
  12. }
  13. Token *makeLexToken(int type, char *str, char *second_str, long int line) {
  14. Token *tmp = makeToken(line);
  15. tmp->token_type = type;
  16. tmp->data.str = memStrcpy(str, 0, false, false);
  17. tmp->data.second_str = memStrcpy(second_str, 0, false, false);
  18. return tmp;
  19. }
  20. Token *makeStatementToken(int type, struct Statement *st){
  21. Token *tmp = makeToken(st->line);
  22. tmp->token_type = type;
  23. tmp->data.st = st;
  24. return tmp;
  25. }
  26. long freeToken(Token *tk, bool self, bool error) {
  27. long int line = 0;
  28. freeBase(tk, return_);
  29. line = tk->line;
  30. memFree(tk->data.str);
  31. memFree(tk->data.second_str);
  32. if (error){
  33. freeStatement(tk->data.st);
  34. }
  35. if (self){
  36. memFree(tk);
  37. }
  38. return_:
  39. return line;
  40. }
  41. TokenStream *makeTokenStream(){
  42. TokenStream *tmp = memCalloc(1, sizeof(TokenStream));
  43. tmp->size = 0;
  44. tmp->token_list = NULL;
  45. return tmp;
  46. }
  47. void freeToekStream(TokenStream *ts, bool self, bool free_st) {
  48. freeBase(ts, return_);
  49. Token *tmp = ts->token_list;
  50. while (tmp != NULL){
  51. Token *tmp_next = tmp->next;
  52. freeToken(tmp, true, free_st);
  53. tmp = tmp_next;
  54. }
  55. if (self){
  56. memFree(ts);
  57. }
  58. return_:
  59. return;
  60. }
  61. TokenMessage *makeTokenMessage(char *file_dir, char *debug) {
  62. TokenMessage *tm = memCalloc(1, sizeof(TokenMessage));
  63. tm->file = makeLexFile(file_dir);
  64. tm->mathers = makeMathers(MATHER_MAX);
  65. tm->ts = makeTokenStream();
  66. #if OUT_LOG
  67. if (debug != NULL){
  68. char *debug_dir = memStrcat(debug, LEXICAL_LOG, false);
  69. if (access(debug_dir, F_OK) != 0 || access(debug_dir, W_OK) == 0)
  70. tm->debug = fopen(debug_dir, "w");
  71. memFree(debug_dir);
  72. }
  73. else{
  74. tm->debug = NULL;
  75. }
  76. #else
  77. tm->debug = NULL;
  78. #endif
  79. return tm;
  80. }
  81. void freeTokenMessage(TokenMessage *tm, bool self, bool free_st) {
  82. freeLexFile(tm->file, true);
  83. freeToekStream(tm->ts, true, free_st);
  84. freeMathers(tm->mathers, true);
  85. #if OUT_LOG
  86. if (tm->debug != NULL)
  87. fclose(tm->debug);
  88. #endif
  89. if (self){
  90. free(tm);
  91. }
  92. }
  93. /**
  94. * 添加一个token到token_ahend,token_list保持
  95. * @param ts
  96. * @param new_tk
  97. */
  98. void addBackToken(TokenStream *ts, Token *new_tk, FILE *debug) {
  99. printTokenEnter(new_tk, debug, DEBUG, "add Token: ");
  100. Token *tmp = ts->token_list;
  101. ts->token_list = new_tk;
  102. new_tk->next = tmp;
  103. new_tk->last = NULL;
  104. if (tmp != NULL)
  105. tmp->last = new_tk;
  106. ts->size ++;
  107. MACRO_printTokenStream(ts, debug, DEEP_DEBUG);
  108. }
  109. /**
  110. * 从token_ahead弹出一个token,保持token_list
  111. * @param ts
  112. * @return
  113. */
  114. Token *popToken(TokenStream *ts, FILE *debug) {
  115. Token *tmp = ts->token_list;
  116. ts->token_list = tmp->next;
  117. tmp->next = NULL;
  118. tmp->last = NULL;
  119. if (ts->token_list != NULL)
  120. ts->token_list->last = NULL;
  121. ts->size --;
  122. printTokenEnter(tmp, debug, DEBUG, "pop Token: ");
  123. MACRO_printTokenStream(ts, debug, DEEP_DEBUG);
  124. return tmp;
  125. }
  126. Token *popNewToken(TokenMessage *tm, FILE *debug) {
  127. Token *tmp;
  128. writeLog_(debug, DEBUG, "pop new token : ", NULL);
  129. if (tm->ts->size == 0){
  130. tmp = getToken(tm->file, tm->mathers, tm->debug);
  131. }
  132. else{
  133. tmp = popToken(tm->ts, debug);
  134. }
  135. writeLog_(debug, DEBUG, "get token: %ld\nnew token: ", tm->file->count);
  136. printToken(tmp, debug, DEBUG);
  137. writeLog_(debug, DEBUG, "\n", NULL);
  138. return tmp;
  139. }
  140. void printToken(Token *tk, FILE *debug, int type) {
  141. if (tk->token_type >= 0) {
  142. char *tmp = tk->data.str, *second_tmp = tk->data.second_str;
  143. if (!strcmp(tmp, "\n")) {
  144. tmp = "\\n";
  145. }
  146. if (!strcmp(second_tmp, "\n")) {
  147. second_tmp = "\\n";
  148. }
  149. if (tmp[0] == EOF) {
  150. tmp = "(EOF)";
  151. }
  152. writeLog_(debug, type, "<token str = ('%s','%s'), type = %d>", tmp, second_tmp, tk->token_type);
  153. }
  154. else{
  155. writeLog_(debug, type, "<token statement, type = %d>", tk->token_type);
  156. }
  157. }
  158. void printTokenStream(TokenStream *ts, FILE *debug, int type) {
  159. writeLog_(debug, type, "token_list: ", NULL);
  160. Token *tmp = ts->token_list;
  161. int i = 0;
  162. while (tmp != NULL){
  163. if (i > 0)
  164. writeLog_(debug, type, "-", NULL);
  165. printToken(tmp, debug, type);
  166. tmp = tmp->next;
  167. i++;
  168. }
  169. writeLog_(debug, type, "\n", NULL);
  170. }