token.c 4.4 KB

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