statement.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #include "__virtualmath.h"
  2. Statement *makeStatement(){
  3. Statement *tmp = memCalloc(1, sizeof(Statement));
  4. tmp->type = start;
  5. tmp->next = NULL;
  6. return tmp;
  7. }
  8. Token *setOperationFromToken(Statement **st_ad, struct Token *left, struct Token *right, int type, bool is_right) {
  9. Token *new_token = NULL;
  10. Statement *st = *st_ad, *left_st = left->data.st;
  11. if (is_right && left->data.st->type == operation &&
  12. left_st->u.operation.OperationType == st->u.operation.OperationType){
  13. st->u.operation.left = left_st->u.operation.right;
  14. left_st->u.operation.right = st;
  15. st->u.operation.right = right->data.st;
  16. st = left_st; // left_st是主中心
  17. }
  18. else{
  19. st->u.operation.left = left_st;
  20. st->u.operation.right = right->data.st;
  21. }
  22. new_token = makeToken();
  23. new_token->token_type = type;
  24. new_token->data.st = st;
  25. freeToken(left, true, false);
  26. freeToken(right, true, false);
  27. *st_ad = st;
  28. return new_token;
  29. }
  30. Statement *makeOperationStatement(int type){
  31. Statement *tmp = makeStatement();
  32. tmp->type = operation;
  33. tmp->u.operation.OperationType = type;
  34. tmp->u.operation.left = NULL;
  35. tmp->u.operation.right = NULL;
  36. return tmp;
  37. }
  38. Statement *makeTupleStatement(Parameter *pt, int type) {
  39. Statement *tmp = makeStatement();
  40. tmp->type = base_list;
  41. tmp->u.base_list.type = type;
  42. tmp->u.base_list.list = pt;
  43. return tmp;
  44. }
  45. Statement *makeFunctionStatement(Statement *name, Statement *function, Parameter *pt) {
  46. Statement *tmp = makeStatement();
  47. tmp->type = set_function;
  48. tmp->u.set_function.name = name;
  49. tmp->u.set_function.function = function;
  50. tmp->u.set_function.parameter = pt;
  51. return tmp;
  52. }
  53. Statement *makeCallStatement(Statement *function, Parameter *pt) {
  54. Statement *tmp = makeStatement();
  55. tmp->type = call_function;
  56. tmp->u.call_function.function = function;
  57. tmp->u.call_function.parameter = pt;
  58. return tmp;
  59. }
  60. Statement *makeIfStatement(){
  61. Statement *tmp = makeStatement();
  62. tmp->type = if_branch;
  63. tmp->u.if_branch.if_list = NULL;
  64. tmp->u.if_branch.else_list = NULL;
  65. tmp->u.if_branch.finally = NULL;
  66. return tmp;
  67. }
  68. Statement *makeWhileStatement(){
  69. Statement *tmp = makeStatement();
  70. tmp->type = while_branch;
  71. tmp->u.while_branch.type = while_;
  72. tmp->u.while_branch.while_list = NULL;
  73. tmp->u.while_branch.else_list = NULL;
  74. tmp->u.while_branch.finally = NULL;
  75. tmp->u.while_branch.first = NULL;
  76. tmp->u.while_branch.after = NULL;
  77. return tmp;
  78. }
  79. Statement *makeTryStatement(){
  80. Statement *tmp = makeStatement();
  81. tmp->type = try_branch;
  82. tmp->u.try_branch.except_list = NULL;
  83. tmp->u.try_branch.else_list = NULL;
  84. tmp->u.try_branch.finally = NULL;
  85. tmp->u.try_branch.try = NULL;
  86. return tmp;
  87. }
  88. Statement *makeBreakStatement(Statement *times){
  89. Statement *tmp = makeStatement();
  90. tmp->type = break_cycle;
  91. tmp->u.break_cycle.times = times;
  92. return tmp;
  93. }
  94. Statement *makeContinueStatement(Statement *times){
  95. Statement *tmp = makeStatement();
  96. tmp->type = continue_cycle;
  97. tmp->u.continue_cycle.times = times;
  98. return tmp;
  99. }
  100. Statement *makeRegoStatement(Statement *times){
  101. Statement *tmp = makeStatement();
  102. tmp->type = rego_if;
  103. tmp->u.rego_if.times = times;
  104. return tmp;
  105. }
  106. Statement *makeRestartStatement(Statement *times){
  107. Statement *tmp = makeStatement();
  108. tmp->type = restart;
  109. tmp->u.restart.times = times;
  110. return tmp;
  111. }
  112. Statement *makeReturnStatement(Statement *value){
  113. Statement *tmp = makeStatement();
  114. tmp->type = return_code;
  115. tmp->u.return_code.value = value;
  116. return tmp;
  117. }
  118. Statement *makeRaiseStatement(Statement *value){
  119. Statement *tmp = makeStatement();
  120. tmp->type = raise_code;
  121. tmp->u.raise_code.value = value;
  122. return tmp;
  123. }
  124. void connectStatement(Statement *base, Statement *new){
  125. while (base->next != NULL){
  126. base = base->next;
  127. }
  128. base->next = new;
  129. }
  130. void freeStatement(Statement *st){
  131. freeBase(st, return_);
  132. Statement *next_tmp;
  133. while (st != NULL){
  134. switch (st->type) {
  135. // base-value 不需要释放
  136. case operation:
  137. freeStatement(st->u.operation.right);
  138. freeStatement(st->u.operation.left);
  139. break;
  140. case base_var:
  141. memFree(st->u.base_var.name);
  142. freeStatement(st->u.base_var.times);
  143. break;
  144. case set_function:
  145. freeStatement(st->u.set_function.name);
  146. freeStatement(st->u.set_function.function);
  147. // Parameter 在 value 的地方free掉
  148. break;
  149. case call_function:
  150. freeStatement(st->u.call_function.function);
  151. freeParameter(st->u.call_function.parameter, true);
  152. break;
  153. case base_list:
  154. freeParameter(st->u.base_list.list, true);
  155. break;
  156. case if_branch:
  157. freeStatementList(st->u.if_branch.if_list);
  158. freeStatement(st->u.if_branch.finally);
  159. freeStatement(st->u.if_branch.else_list);
  160. break;
  161. case while_branch:
  162. freeStatementList(st->u.while_branch.while_list);
  163. freeStatement(st->u.while_branch.first);
  164. freeStatement(st->u.while_branch.after);
  165. freeStatement(st->u.while_branch.else_list);
  166. freeStatement(st->u.while_branch.finally);
  167. break;
  168. case for_branch:
  169. freeStatementList(st->u.for_branch.for_list);
  170. freeStatement(st->u.for_branch.var);
  171. freeStatement(st->u.for_branch.iter);
  172. freeStatement(st->u.for_branch.else_list);
  173. freeStatement(st->u.for_branch.finally);
  174. break;
  175. case try_branch:
  176. freeStatementList(st->u.try_branch.except_list);
  177. freeStatement(st->u.try_branch.try);
  178. freeStatement(st->u.try_branch.else_list);
  179. freeStatement(st->u.try_branch.finally);
  180. break;
  181. case with_branch:
  182. freeStatementList(st->u.with_branch.with_list);
  183. freeStatement(st->u.with_branch.else_list);
  184. freeStatement(st->u.with_branch.finally);
  185. break;
  186. case break_cycle:
  187. freeStatement(st->u.break_cycle.times);
  188. break;
  189. case continue_cycle:
  190. freeStatement(st->u.continue_cycle.times);
  191. break;
  192. case rego_if:
  193. freeStatement(st->u.rego_if.times);
  194. break;
  195. case restart:
  196. freeStatement(st->u.restart.times);
  197. break;
  198. case return_code:
  199. freeStatement(st->u.return_code.value);
  200. break;
  201. case raise_code:
  202. freeStatement(st->u.raise_code.value);
  203. break;
  204. default:
  205. break;
  206. }
  207. next_tmp = st->next;
  208. memFree(st);
  209. st = next_tmp;
  210. }
  211. return_:
  212. return;
  213. }
  214. StatementList *makeStatementList(Statement *condition, Statement *var, Statement *code, int type) {
  215. StatementList *tmp = memCalloc(1, sizeof(StatementList));
  216. tmp->condition = condition;
  217. tmp->var = var;
  218. tmp->code = code;
  219. tmp->type = type;
  220. tmp->next = NULL;
  221. return tmp;
  222. }
  223. StatementList *connectStatementList(StatementList *base, StatementList *new){
  224. StatementList *tmp = base;
  225. if (base == NULL)
  226. return new;
  227. while (tmp->next != NULL){
  228. tmp = tmp->next;
  229. }
  230. tmp->next = new;
  231. return base;
  232. }
  233. void freeStatementList(StatementList *base){
  234. while (base != NULL){
  235. freeStatement(base->condition);
  236. freeStatement(base->code);
  237. freeStatement(base->var);
  238. StatementList *tmp = base;
  239. base = base->next;
  240. memFree(tmp);
  241. }
  242. }