statement.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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 *makeBaseValueStatement(LinkValue *value){
  31. Statement *tmp = makeStatement();
  32. tmp->type = base_value;
  33. tmp->u.base_value.value = value;
  34. return tmp;
  35. }
  36. Statement *makeBaseVarStatement(char *name, Statement *times){
  37. Statement *tmp = makeStatement();
  38. tmp->type = base_var;
  39. tmp->u.base_var.name = memStrcpy(name, 0, false, false);
  40. tmp->u.base_var.times = times;
  41. return tmp;
  42. }
  43. Statement *makeBaseSVarStatement(Statement *name, Statement *times){
  44. Statement *tmp = makeStatement();
  45. tmp->type = base_svar;
  46. tmp->u.base_svar.name = name;
  47. tmp->u.base_svar.times = times;
  48. return tmp;
  49. }
  50. Statement *makeBaseDictStatement(Parameter *pt){
  51. Statement *tmp = makeStatement();
  52. tmp->type = base_dict;
  53. tmp->u.base_dict.dict = pt;
  54. return tmp;
  55. }
  56. Statement *makeOperationStatement(int type){
  57. Statement *tmp = makeStatement();
  58. tmp->type = operation;
  59. tmp->u.operation.OperationType = type;
  60. tmp->u.operation.left = NULL;
  61. tmp->u.operation.right = NULL;
  62. return tmp;
  63. }
  64. Statement *makeTupleStatement(Parameter *pt, enum ListType type) {
  65. Statement *tmp = makeStatement();
  66. tmp->type = base_list;
  67. tmp->u.base_list.type = type;
  68. tmp->u.base_list.list = pt;
  69. return tmp;
  70. }
  71. Statement *makeFunctionStatement(Statement *name, Statement *function, Parameter *pt) {
  72. Statement *tmp = makeStatement();
  73. tmp->type = set_function;
  74. tmp->u.set_function.name = name;
  75. tmp->u.set_function.function = function;
  76. tmp->u.set_function.parameter = pt;
  77. return tmp;
  78. }
  79. Statement *makeCallStatement(Statement *function, Parameter *pt) {
  80. Statement *tmp = makeStatement();
  81. tmp->type = call_function;
  82. tmp->u.call_function.function = function;
  83. tmp->u.call_function.parameter = pt;
  84. return tmp;
  85. }
  86. Statement *makeIfStatement(){
  87. Statement *tmp = makeStatement();
  88. tmp->type = if_branch;
  89. tmp->u.if_branch.if_list = NULL;
  90. tmp->u.if_branch.else_list = NULL;
  91. tmp->u.if_branch.finally = NULL;
  92. return tmp;
  93. }
  94. Statement *makeWhileStatement(){
  95. Statement *tmp = makeStatement();
  96. tmp->type = while_branch;
  97. tmp->u.while_branch.type = while_;
  98. tmp->u.while_branch.while_list = NULL;
  99. tmp->u.while_branch.else_list = NULL;
  100. tmp->u.while_branch.finally = NULL;
  101. tmp->u.while_branch.first = NULL;
  102. tmp->u.while_branch.after = NULL;
  103. return tmp;
  104. }
  105. Statement *makeTryStatement(){
  106. Statement *tmp = makeStatement();
  107. tmp->type = try_branch;
  108. tmp->u.try_branch.except_list = NULL;
  109. tmp->u.try_branch.else_list = NULL;
  110. tmp->u.try_branch.finally = NULL;
  111. tmp->u.try_branch.try = NULL;
  112. return tmp;
  113. }
  114. Statement *makeBreakStatement(Statement *times){
  115. Statement *tmp = makeStatement();
  116. tmp->type = break_cycle;
  117. tmp->u.break_cycle.times = times;
  118. return tmp;
  119. }
  120. Statement *makeContinueStatement(Statement *times){
  121. Statement *tmp = makeStatement();
  122. tmp->type = continue_cycle;
  123. tmp->u.continue_cycle.times = times;
  124. return tmp;
  125. }
  126. Statement *makeRegoStatement(Statement *times){
  127. Statement *tmp = makeStatement();
  128. tmp->type = rego_if;
  129. tmp->u.rego_if.times = times;
  130. return tmp;
  131. }
  132. Statement *makeRestartStatement(Statement *times){
  133. Statement *tmp = makeStatement();
  134. tmp->type = restart;
  135. tmp->u.restart.times = times;
  136. return tmp;
  137. }
  138. Statement *makeReturnStatement(Statement *value){
  139. Statement *tmp = makeStatement();
  140. tmp->type = return_code;
  141. tmp->u.return_code.value = value;
  142. return tmp;
  143. }
  144. Statement *makeRaiseStatement(Statement *value){
  145. Statement *tmp = makeStatement();
  146. tmp->type = raise_code;
  147. tmp->u.raise_code.value = value;
  148. return tmp;
  149. }
  150. void connectStatement(Statement *base, Statement *new){
  151. while (base->next != NULL){
  152. base = base->next;
  153. }
  154. base->next = new;
  155. }
  156. void freeStatement(Statement *st){
  157. freeBase(st, return_);
  158. Statement *next_tmp;
  159. while (st != NULL){
  160. switch (st->type) {
  161. // base-value 不需要释放
  162. case operation:
  163. freeStatement(st->u.operation.right);
  164. freeStatement(st->u.operation.left);
  165. break;
  166. case base_var:
  167. memFree(st->u.base_var.name);
  168. freeStatement(st->u.base_var.times);
  169. break;
  170. case base_svar:
  171. freeStatement(st->u.base_svar.name);
  172. freeStatement(st->u.base_svar.times);
  173. break;
  174. case set_function:
  175. freeStatement(st->u.set_function.name);
  176. freeStatement(st->u.set_function.function);
  177. // Parameter 在 value 的地方free掉
  178. break;
  179. case call_function:
  180. freeStatement(st->u.call_function.function);
  181. freeParameter(st->u.call_function.parameter, true);
  182. break;
  183. case base_list:
  184. freeParameter(st->u.base_list.list, true);
  185. break;
  186. case base_dict:
  187. freeParameter(st->u.base_dict.dict, true);
  188. break;
  189. case if_branch:
  190. freeStatementList(st->u.if_branch.if_list);
  191. freeStatement(st->u.if_branch.finally);
  192. freeStatement(st->u.if_branch.else_list);
  193. break;
  194. case while_branch:
  195. freeStatementList(st->u.while_branch.while_list);
  196. freeStatement(st->u.while_branch.first);
  197. freeStatement(st->u.while_branch.after);
  198. freeStatement(st->u.while_branch.else_list);
  199. freeStatement(st->u.while_branch.finally);
  200. break;
  201. case for_branch:
  202. freeStatementList(st->u.for_branch.for_list);
  203. freeStatement(st->u.for_branch.var);
  204. freeStatement(st->u.for_branch.iter);
  205. freeStatement(st->u.for_branch.else_list);
  206. freeStatement(st->u.for_branch.finally);
  207. break;
  208. case try_branch:
  209. freeStatementList(st->u.try_branch.except_list);
  210. freeStatement(st->u.try_branch.try);
  211. freeStatement(st->u.try_branch.else_list);
  212. freeStatement(st->u.try_branch.finally);
  213. break;
  214. case with_branch:
  215. freeStatementList(st->u.with_branch.with_list);
  216. freeStatement(st->u.with_branch.else_list);
  217. freeStatement(st->u.with_branch.finally);
  218. break;
  219. case break_cycle:
  220. freeStatement(st->u.break_cycle.times);
  221. break;
  222. case continue_cycle:
  223. freeStatement(st->u.continue_cycle.times);
  224. break;
  225. case rego_if:
  226. freeStatement(st->u.rego_if.times);
  227. break;
  228. case restart:
  229. freeStatement(st->u.restart.times);
  230. break;
  231. case return_code:
  232. freeStatement(st->u.return_code.value);
  233. break;
  234. case raise_code:
  235. freeStatement(st->u.raise_code.value);
  236. break;
  237. default:
  238. break;
  239. }
  240. next_tmp = st->next;
  241. memFree(st);
  242. st = next_tmp;
  243. }
  244. return_:
  245. return;
  246. }
  247. StatementList *makeStatementList(Statement *condition, Statement *var, Statement *code, int type) {
  248. StatementList *tmp = memCalloc(1, sizeof(StatementList));
  249. tmp->condition = condition;
  250. tmp->var = var;
  251. tmp->code = code;
  252. tmp->type = type;
  253. tmp->next = NULL;
  254. return tmp;
  255. }
  256. StatementList *connectStatementList(StatementList *base, StatementList *new){
  257. StatementList *tmp = base;
  258. if (base == NULL)
  259. return new;
  260. while (tmp->next != NULL){
  261. tmp = tmp->next;
  262. }
  263. tmp->next = new;
  264. return base;
  265. }
  266. void freeStatementList(StatementList *base){
  267. while (base != NULL){
  268. freeStatement(base->condition);
  269. freeStatement(base->code);
  270. freeStatement(base->var);
  271. StatementList *tmp = base;
  272. base = base->next;
  273. memFree(tmp);
  274. }
  275. }