token.c 4.6 KB

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