token.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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. return tmp;
  9. }
  10. Token *makeLexToken(int type, char *str, char *second_str) {
  11. struct Token *tmp = makeToken();
  12. tmp->token_type = type;
  13. tmp->data.str = memStrcpy(str, 0, false, false);
  14. tmp->data.second_str = memStrcpy(second_str, 0, false, false);
  15. return tmp;
  16. }
  17. Token *makeStatementToken(int type, struct Statement *st){
  18. struct Token *tmp = makeToken();
  19. tmp->token_type = type;
  20. tmp->data.st = st;
  21. return tmp;
  22. }
  23. void freeToken(Token *tk, bool self, bool error) {
  24. freeBase(tk, return_);
  25. memFree(tk->data.str);
  26. memFree(tk->data.second_str);
  27. if (error){
  28. freeStatement(tk->data.st);
  29. }
  30. if (self){
  31. memFree(tk);
  32. }
  33. return_:
  34. return;
  35. }
  36. TokenStream *makeTokenStream(){
  37. TokenStream *tmp = memCalloc(1, sizeof(TokenStream));
  38. tmp->size = 0;
  39. tmp->ahead = 0;
  40. tmp->token_list = NULL;
  41. tmp->token_ahead = NULL;
  42. return tmp;
  43. }
  44. void freeToekStream(TokenStream *ts, bool self) {
  45. freeBase(ts, return_);
  46. for (int i=0; i < ts->size; i++){
  47. freeToken(ts->token_list[i], true, false);
  48. }
  49. for (int i=0; i < ts->ahead; i++){
  50. freeToken(ts->token_ahead[i], true, false);
  51. }
  52. memFree(ts->token_list);
  53. memFree(ts->token_ahead);
  54. if (self){
  55. memFree(ts);
  56. }
  57. return_:
  58. return;
  59. }
  60. TokenMessage *makeTokenMessage(char *file_dir, char *debug) {
  61. TokenMessage *tm = memCalloc(1, sizeof(TokenMessage));
  62. tm->file = makeLexFile(file_dir);
  63. tm->mathers = makeMathers(MATHER_MAX);
  64. tm->ts = makeTokenStream();
  65. #if OUT_LOG
  66. if (debug != NULL){
  67. char *debug_dir = memStrcat(debug, LEXICAL_LOG);
  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) {
  80. freeLexFile(tm->file, true);
  81. freeToekStream(tm->ts, true);
  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_list,token_ahend保持
  93. * @param ts
  94. * @param new_tk
  95. */
  96. void addToken(TokenStream *ts, Token *new_tk, FILE *debug) {
  97. printTokenEnter(new_tk, debug, DEBUG, "add Token: ");
  98. Token **new_list = memCalloc(ts->size + 1, sizeof(Token *));
  99. for (int i=0; i < ts->size; i++){
  100. new_list[i] = ts->token_list[i];
  101. }
  102. new_list[ts->size] = new_tk;
  103. ts->size ++;
  104. memFree(ts->token_list);
  105. ts->token_list = new_list;
  106. MACRO_printTokenStream(ts, debug, DEEP_DEBUG);
  107. }
  108. /**
  109. * 从token_list弹出一个token,保持token_ahend
  110. * @param ts
  111. * @return
  112. */
  113. Token *popToken(TokenStream *ts, FILE *debug) {
  114. Token **new_list = memCalloc(ts->size - 1, sizeof(Token *));
  115. for (int i=0; i < ts->size - 1; i++){
  116. new_list[i] = ts->token_list[i];
  117. }
  118. Token *tmp = ts->token_list[ts->size - 1];
  119. memFree(ts->token_list);
  120. ts->token_list = new_list;
  121. ts->size --;
  122. printTokenEnter(tmp, debug, DEBUG, "pop Token: ");
  123. MACRO_printTokenStream(ts, debug, DEEP_DEBUG);
  124. return tmp;
  125. }
  126. /**
  127. * 把token_list的一个token退回到token_ahend
  128. * @param ts
  129. * @return
  130. */
  131. Token *backToken(TokenStream *ts, FILE *debug) {
  132. Token **new_list = memCalloc(ts->size - 1, sizeof(Token *));
  133. Token **new_ahead = memCalloc(ts->ahead + 1, sizeof(Token *));
  134. for (int i=0; i < ts->size - 1; i++){
  135. new_list[i] = ts->token_list[i];
  136. }
  137. for (int i=0; i < ts->ahead; i++){
  138. new_ahead[i] = ts->token_ahead[i];
  139. }
  140. new_ahead[ts->ahead] = ts->token_list[ts->size - 1];
  141. memFree(ts->token_list);
  142. memFree(ts->token_ahead);
  143. ts->token_ahead = new_ahead;
  144. ts->token_list = new_list;
  145. ts->size --;
  146. ts->ahead ++;
  147. printTokenEnter(new_ahead[ts->ahead - 1], debug, DEBUG, "back Token: ");
  148. MACRO_printTokenStream(ts, debug, DEEP_DEBUG);
  149. return new_ahead[ts->ahead - 1];
  150. }
  151. /**
  152. * backToken的逆向操作
  153. * @param ts
  154. * @return
  155. */
  156. Token *forwardToken(TokenStream *ts, FILE *debug) {
  157. Token **new_list = memCalloc(ts->size + 1, sizeof(Token *));
  158. Token **new_ahead = memCalloc(ts->ahead - 1, sizeof(Token *));
  159. for (int i=0; i < ts->size; i++){
  160. new_list[i] = ts->token_list[i];
  161. }
  162. for (int i=0; i < ts->ahead - 1; i++){
  163. new_ahead[i] = ts->token_ahead[i];
  164. }
  165. new_list[ts->size] = ts->token_ahead[ts->ahead - 1];
  166. memFree(ts->token_list);
  167. memFree(ts->token_ahead);
  168. ts->token_ahead = new_ahead;
  169. ts->token_list = new_list;
  170. ts->size ++;
  171. ts->ahead --;
  172. printTokenEnter(new_list[ts->size - 1], debug, DEBUG, "forward Token: ");
  173. MACRO_printTokenStream(ts, debug, DEEP_DEBUG);
  174. return new_list[ts->size - 1];
  175. }
  176. /**
  177. * 获取token, 并且放入token_list中
  178. * 自动处理backToken
  179. * @param tm
  180. * @return 返回获取token的token_type
  181. */
  182. int safeGetToken(TokenMessage *tm, FILE *debug) {
  183. writeLog_(debug, DEBUG, "safe get token : ", NULL);
  184. Token *tmp;
  185. if (tm->ts->ahead == 0){
  186. writeLog_(debug, DEBUG, "get token: %d\n", tm->file->count);
  187. tmp = getToken(tm->file, tm->mathers, tm->debug);
  188. addToken(tm->ts, tmp, debug);
  189. MACRO_printTokenStream(tm->ts, debug, DEBUG);
  190. }
  191. else{
  192. // forwardToken 会有详细的日志输出
  193. tmp = forwardToken(tm->ts, debug);
  194. }
  195. return tmp->token_type;
  196. }
  197. void printToken(Token *tk, FILE *debug, int type) {
  198. if (tk->token_type >= 0) {
  199. char *tmp = tk->data.str, *second_tmp = tk->data.second_str;
  200. if (!strcmp(tmp, "\n")) {
  201. tmp = "\\n";
  202. }
  203. if (!strcmp(second_tmp, "\n")) {
  204. second_tmp = "\\n";
  205. }
  206. if (tmp[0] == EOF) {
  207. tmp = "(EOF)";
  208. }
  209. writeLog_(debug, type, "<token str = ('%s','%s'), type = %d>", tmp, second_tmp, tk->token_type);
  210. }
  211. else{
  212. writeLog_(debug, type, "<token statement, type = %d>", tk->token_type);
  213. }
  214. }
  215. void printTokenStream(TokenStream *ts, FILE *debug, int type) {
  216. writeLog_(debug, type, "token_list: ", NULL);
  217. for (int i=0; i < ts->size; i ++){
  218. if (i > 0)
  219. writeLog_(debug, type, "-", NULL);
  220. printToken(ts->token_list[i], debug, type);
  221. }
  222. writeLog_(debug, type, "\n", NULL);
  223. writeLog_(debug, type, "token_ahead: ", NULL);
  224. for (int i=0; i < ts->ahead; i ++){
  225. if (i > 0)
  226. writeLog_(debug, type, "-", NULL);
  227. printToken(ts->token_ahead[i], debug, type);
  228. }
  229. writeLog_(debug, type, "\n", NULL);
  230. }