token.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "__virtualmath.h"
  2. Token *makeToken(fline 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, wchar_t *str, wchar_t *second_str, fline line) {
  13. Token *tmp = makeToken(line);
  14. tmp->token_type = type;
  15. tmp->data.str = memWidecpy(str);
  16. tmp->data.second_str = memWidecpy(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 free_st) {
  26. fline line = 0;
  27. FREE_BASE(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. memFree(tk);
  34. return_:
  35. return line;
  36. }
  37. TokenStream *makeTokenStream(){
  38. TokenStream *tmp = memCalloc(1, sizeof(TokenStream));
  39. tmp->size = 0;
  40. tmp->token_list = NULL;
  41. return tmp;
  42. }
  43. void freeToekStream(TokenStream *ts, bool free_st) {
  44. FREE_BASE(ts, return_);
  45. for (Token *tmp = ts->token_list, *tmp_next=NULL; tmp != NULL; tmp = tmp_next){
  46. tmp_next = tmp->next;
  47. freeToken(tmp, free_st);
  48. }
  49. memFree(ts);
  50. return_:
  51. return;
  52. }
  53. static TokenMessage *makeTokenMessageCore() {
  54. TokenMessage *tm = memCalloc(1, sizeof(TokenMessage));
  55. tm->file = NULL;
  56. tm->mathers = makeMathers(MATHER_MAX);
  57. tm->ts = makeTokenStream();
  58. return tm;
  59. }
  60. TokenMessage *makeTokenMessageFile(char *file_dir) {
  61. TokenMessage *tm = makeTokenMessageCore();
  62. tm->file = makeLexFile(file_dir);
  63. return tm;
  64. }
  65. TokenMessage *makeTokenMessageStr(wchar_t *str) {
  66. TokenMessage *tm = makeTokenMessageCore();
  67. tm->file = makeLexStr(str);
  68. return tm;
  69. }
  70. void freeTokenMessage(TokenMessage *tm, bool self, bool free_st) {
  71. freeLexFile(tm->file);
  72. freeToekStream(tm->ts, free_st);
  73. freeMathers(tm->mathers);
  74. if (self)
  75. free(tm);
  76. }
  77. /**
  78. * 添加一个token到token_ahend,token_list保持
  79. * @param ts
  80. * @param new_tk
  81. */
  82. void addBackToken(TokenStream *ts, Token *new_tk) {
  83. Token *tmp = ts->token_list;
  84. ts->token_list = new_tk;
  85. new_tk->next = tmp;
  86. ts->size ++;
  87. }
  88. /**
  89. * 从token_ahead弹出一个token,保持token_list
  90. * @param ts
  91. * @return
  92. */
  93. Token *popToken(TokenStream *ts) {
  94. Token *tmp = ts->token_list;
  95. ts->token_list = tmp->next;
  96. tmp->next = NULL;
  97. ts->size --;
  98. return tmp;
  99. }
  100. Token *popNewToken(TokenMessage *tm) {
  101. Token *tmp;
  102. if (tm->ts->size == 0)
  103. tmp = getToken(tm->file, tm->mathers);
  104. else
  105. tmp = popToken(tm->ts);
  106. return tmp;
  107. }