token.c 4.5 KB

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