token.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. return tmp;
  11. }
  12. Token *makeLexToken(int type, char *str, char *second_str, long int line) {
  13. Token *tmp = makeToken(line);
  14. tmp->token_type = type;
  15. tmp->data.str = memStrcpy(str);
  16. tmp->data.second_str = memStrcpy(second_str);
  17. return tmp;
  18. }
  19. Token *makeStatementToken(int type, struct Statement *st){
  20. Token *tmp = makeToken(st->line);
  21. tmp->token_type = type;
  22. tmp->data.st = st;
  23. return tmp;
  24. }
  25. long freeToken(Token *tk, bool self, bool free_st) {
  26. long int line = 0;
  27. freeBase(tk, return_);
  28. line = tk->line;
  29. memFree(tk->data.str);
  30. memFree(tk->data.second_str);
  31. if (free_st)
  32. freeStatement(tk->data.st);
  33. if (self)
  34. memFree(tk);
  35. return_:
  36. return line;
  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) {
  59. TokenMessage *tm = memCalloc(1, sizeof(TokenMessage));
  60. tm->file = makeLexFile(file_dir);
  61. tm->mathers = makeMathers(MATHER_MAX);
  62. tm->ts = makeTokenStream();
  63. return tm;
  64. }
  65. void freeTokenMessage(TokenMessage *tm, bool self, bool free_st) {
  66. freeLexFile(tm->file, true);
  67. freeToekStream(tm->ts, true, free_st);
  68. freeMathers(tm->mathers, true);
  69. if (self)
  70. free(tm);
  71. }
  72. /**
  73. * 添加一个token到token_ahend,token_list保持
  74. * @param ts
  75. * @param new_tk
  76. */
  77. void addBackToken(TokenStream *ts, Token *new_tk) {
  78. Token *tmp = ts->token_list;
  79. ts->token_list = new_tk;
  80. new_tk->next = tmp;
  81. ts->size ++;
  82. }
  83. /**
  84. * 从token_ahead弹出一个token,保持token_list
  85. * @param ts
  86. * @return
  87. */
  88. Token *popToken(TokenStream *ts) {
  89. Token *tmp = ts->token_list;
  90. ts->token_list = tmp->next;
  91. tmp->next = NULL;
  92. ts->size --;
  93. return tmp;
  94. }
  95. Token *popNewToken(TokenMessage *tm) {
  96. Token *tmp;
  97. if (tm->ts->size == 0)
  98. tmp = getToken(tm->file, tm->mathers);
  99. else
  100. tmp = popToken(tm->ts);
  101. return tmp;
  102. }