tree.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "interpreter.h"
  5. #define print_lv(lv) \
  6. for(int i=0;i<lv;i++){ \
  7. fprintf(tree_info, " "); \
  8. } \
  9. fprintf(tree_info, "%d-", lv);
  10. #define print_t(str, t_statement) \
  11. do{ \
  12. print_lv(lv + 1); \
  13. fprintf(tree_info, str); \
  14. traverse_tree(t_statement, lv + 2); \
  15. }while(0);
  16. #define print_p(str, t_statement) \
  17. do{ \
  18. print_lv(lv + 1); \
  19. fprintf(tree_info, str); \
  20. parameter_tree(t_statement, lv + 2); \
  21. }while(0);
  22. #define print_i(str, t_statement) \
  23. do{ \
  24. print_lv(lv + 1); \
  25. fprintf(tree_info, str); \
  26. if_tree(t_statement, lv + 2); \
  27. }while(0);
  28. void print_statement(statement *the_statement, int lv){ // read the statement list with case to run by func
  29. print_lv(lv);
  30. switch (the_statement->type)
  31. {
  32. case operation: // 表达式运算
  33. fprintf(tree_info, "[operation](type = %d)\n", the_statement->code.operation.type);
  34. print_t("left\n", the_statement->code.operation.left_exp);
  35. print_t("right\n", the_statement->code.operation.right_exp);
  36. break;
  37. case chose_exp:{
  38. fprintf(tree_info, "[chose_exp]\n");
  39. print_t("condition\n", the_statement->code.chose_exp.condition);
  40. print_t("true_do\n", the_statement->code.chose_exp.true_do);
  41. print_t("false_do\n", the_statement->code.chose_exp.false_do);
  42. break;
  43. }
  44. case call:
  45. fprintf(tree_info, "[call]\n");
  46. print_t("func\n", the_statement->code.call.func);
  47. print_p("parameter_list\n", the_statement->code.call.parameter_list);
  48. break;
  49. case while_cycle:
  50. fprintf(tree_info, "[while_cycle]%s\n", (the_statement->code.while_cycle.first_do ? "(do ... while)" : "(while ... )"));
  51. print_t("condition\n", the_statement->code.while_cycle.condition);
  52. print_t("done\n", the_statement->code.while_cycle.done);
  53. print_t("else_do\n", the_statement->code.while_cycle.else_do);
  54. break;
  55. case for_cycle:
  56. fprintf(tree_info, "[for_cycle]\n");
  57. print_t("condition\n", the_statement->code.for_cycle.condition);
  58. print_t("first\n", the_statement->code.for_cycle.first);
  59. print_t("after\n", the_statement->code.for_cycle.after);
  60. print_t("done\n", the_statement->code.for_cycle.done);
  61. print_t("else_do\n", the_statement->code.for_cycle.else_do);
  62. break;
  63. case for_in_cycle:
  64. fprintf(tree_info, "[for in ]\n");
  65. print_t("var\n", the_statement->code.for_in_cycle.var);
  66. print_t("iter\n", the_statement->code.for_in_cycle.iter);
  67. print_t("done\n", the_statement->code.for_in_cycle.done);
  68. print_t("else_do\n", the_statement->code.for_in_cycle.else_do);
  69. break;
  70. case if_branch:
  71. fprintf(tree_info, "[if branch]\n");
  72. print_i("done", the_statement->code.if_branch.done)
  73. break;
  74. case pack_eq:
  75. fprintf(tree_info, "[pack_eq]\n");
  76. print_p("left\n", the_statement->code.pack_eq.left);
  77. print_p("right\n", the_statement->code.pack_eq.right);
  78. break;
  79. case base_value:
  80. fprintf(tree_info, "[base_value](type = %d)(token = %d)(value = ", the_statement->code.base_value.value.type, the_statement->code.base_value.value.lock_token);
  81. switch (the_statement->code.base_value.value.type)
  82. {
  83. case NULL_value:
  84. fprintf(tree_info, "<None>[None show]");
  85. break;
  86. case INT_value:
  87. fprintf(tree_info, "%d[int not show]", the_statement->code.base_value.value.value.int_value);
  88. break;
  89. case NUMBER_value:
  90. fprintf(tree_info, "%f[double not show]", the_statement->code.base_value.value.value.double_value);
  91. break;
  92. case STRING_value:
  93. fprintf(tree_info, "'%s'[str not show]", the_statement->code.base_value.value.value.string);
  94. break;
  95. case FUNC_value:
  96. fprintf(tree_info, "%x[func show]", the_statement->code.base_value.value.value.func_value);
  97. break;
  98. case CLASS_value:
  99. fprintf(tree_info, "%x[class show]", the_statement->code.base_value.value.value.class_value);
  100. break;
  101. case OBJECT_value:
  102. fprintf(tree_info, "%x[object show]", the_statement->code.base_value.value.value.object_value);
  103. break;
  104. case LIST_value:
  105. fprintf(tree_info, "%x[list not show]", the_statement->code.base_value.value.value.list_value);
  106. break;
  107. case DICT_value:
  108. fprintf(tree_info, "%x[list not show]", the_statement->code.base_value.value.value.dict_value);
  109. break;
  110. default:
  111. fprintf(tree_info, "WRONG!!!");
  112. break;
  113. }
  114. fprintf(tree_info, ")\n");
  115. break;
  116. case base_tuple:{
  117. fprintf(tree_info, "[base_tuple]\n");
  118. print_p("value\n", the_statement->code.base_tuple.value);
  119. break;
  120. }
  121. case base_list:{
  122. fprintf(tree_info, "[base_list]\n");
  123. print_p("value\n", the_statement->code.base_list.value);
  124. break;
  125. }
  126. case base_dict:{
  127. fprintf(tree_info, "[base_dict]\n");
  128. print_p("value\n", the_statement->code.base_dict.value);
  129. break;
  130. }
  131. case slice:{
  132. fprintf(tree_info, "[slice]\n");
  133. print_t("base_var\n", the_statement->code.slice.base_var);
  134. print_p("value\n", the_statement->code.slice.value);
  135. break;
  136. }
  137. case base_var:{ // 访问变量
  138. fprintf(tree_info, "[base_var](name = %s)(token = %d)\n", the_statement->code.base_var.var_name, the_statement->code.base_var.lock_token);
  139. print_t("from\n", the_statement->code.base_var.from);
  140. break;
  141. }
  142. case base_svar:{
  143. fprintf(tree_info, "[base_svar](token = %d)\n", the_statement->code.base_svar.lock_token);
  144. print_t("var\n", the_statement->code.base_svar.var);
  145. print_t("from\n", the_statement->code.base_svar.from);
  146. break;
  147. }
  148. case point:{
  149. fprintf(tree_info, "[point]\n");
  150. print_t("base\n", the_statement->code.point.base_var);
  151. print_t("child\n", the_statement->code.point.child_var);
  152. break;
  153. }
  154. case down:{
  155. fprintf(tree_info, "[down]\n");
  156. print_t("base_var\n", the_statement->code.down.base_var);
  157. print_p("child_var\n", the_statement->code.down.child_var);
  158. break;
  159. }
  160. case def:{
  161. fprintf(tree_info, "[def](type = %d, is_inline = %d)\n", the_statement->code.def.type, the_statement->code.def.is_inline);
  162. print_t("var(name)\n", the_statement->code.def.var);
  163. print_p("parameter_list\n", the_statement->code.def.parameter_list);
  164. print_t("setup\n", the_statement->code.def.setup);
  165. print_t("done\n", the_statement->code.def.done);
  166. break;
  167. }
  168. case lambda_func:{
  169. fprintf(tree_info, "[lambda_func]\n");
  170. print_p("parameter_list\n", the_statement->code.lambda_func.parameter_list);
  171. print_t("done\n", the_statement->code.lambda_func.done);
  172. break;
  173. }
  174. case set_class:{
  175. fprintf(tree_info, "[set_class]\n");
  176. print_t("var(name)\n", the_statement->code.set_class.var);
  177. print_p("father_list\n", the_statement->code.set_class.father_list);
  178. print_t("done\n", the_statement->code.set_class.done);
  179. break;
  180. }
  181. case break_cycle:
  182. fprintf(tree_info, "[break_cycle]\n");
  183. print_t("times\n", the_statement->code.break_cycle.times);
  184. break;
  185. case broken:
  186. fprintf(tree_info, "[broken]\n");
  187. print_t("times\n", the_statement->code.broken.times);
  188. break;
  189. case continue_cycle:
  190. fprintf(tree_info, "[continue_cycle]\n");
  191. print_t("times\n", the_statement->code.continue_cycle.times);
  192. break;
  193. case continued:
  194. fprintf(tree_info, "[continued]\n");
  195. print_t("times\n", the_statement->code.continued.times);
  196. break;
  197. case restart:
  198. fprintf(tree_info, "[restart]\n");
  199. print_t("times\n", the_statement->code.restart.times);
  200. break;
  201. case restarted:
  202. fprintf(tree_info, "[restarted]\n");
  203. print_t("times\n", the_statement->code.restarted.times);
  204. break;
  205. case return_code:
  206. fprintf(tree_info, "[return_code]\n");
  207. print_t("value\n", the_statement->code.return_code.value);
  208. print_t("times\n", the_statement->code.return_code.times);
  209. break;
  210. case rewent:
  211. fprintf(tree_info, "[rewent]\n");
  212. break;
  213. case rego:
  214. fprintf(tree_info, "[rego]\n");
  215. break;
  216. case set_default:{
  217. fprintf(tree_info, "[set_default] [var(name) = %s]\n", the_statement->code.set_default.name);
  218. print_t("times\n", the_statement->code.set_default.times);
  219. break;
  220. }
  221. case set_global:{
  222. fprintf(tree_info, "[set_global] [var(name) = %s]\n", the_statement->code.set_global.name);
  223. break;
  224. }
  225. case set_nonlocal:{
  226. fprintf(tree_info, "[set_nonlocal] [var(name) = %s]\n", the_statement->code.set_nonlocal.name);
  227. break;
  228. }
  229. case code_block:
  230. fprintf(tree_info, "[code_block]\n");
  231. print_t("done\n", the_statement->code.code_block.done);
  232. break;
  233. case try_code:
  234. fprintf(tree_info, "[try_code]\n");
  235. print_t("try\n", the_statement->code.try_code.try);
  236. print_t("except\n", the_statement->code.try_code.except);
  237. print_t("var\n", the_statement->code.try_code.var);
  238. print_t("else_do\n", the_statement->code.try_code.else_do);
  239. print_t("finally_do\n", the_statement->code.try_code.finally_do);
  240. break;
  241. case raise_e:
  242. fprintf(tree_info, "[raise_e]\n");
  243. print_t("info\n", the_statement->code.raise_e.info);
  244. print_t("done\n", the_statement->code.raise_e.done);
  245. break;
  246. case throw_e:
  247. fprintf(tree_info, "[throw_e]\n");
  248. print_t("done\n", the_statement->code.throw_e.done);
  249. break;
  250. case import_class: // import xxx as xxx 语句
  251. fprintf(tree_info, "[import_class]\n");
  252. print_t("file\n", the_statement->code.import_class.file);
  253. print_t("var\n", the_statement->code.import_class.var);
  254. break;
  255. case include_import: // include xxx
  256. fprintf(tree_info, "[include_import]\n");
  257. print_t("file\n", the_statement->code.include_import.file);
  258. break;
  259. case assert_e:
  260. fprintf(tree_info, "[assert_e]\n");
  261. print_t("condition\n", the_statement->code.assert_e.condition);
  262. print_t("info\n", the_statement->code.assert_e.info);
  263. break;
  264. default:
  265. fprintf(tree_info, "[start]\n");
  266. break;
  267. }
  268. return_result: return;
  269. }
  270. void traverse_tree(statement *the_statement, int lv){
  271. statement *tmp = the_statement;
  272. if(the_statement == NULL){
  273. print_lv(lv);
  274. fprintf(tree_info, "NULL\n");
  275. goto return_back;
  276. }
  277. else{
  278. }
  279. while(1){
  280. if(tmp == NULL){
  281. break;
  282. }
  283. print_statement(tmp, lv);
  284. tmp = tmp->next;
  285. }
  286. return_back: return;
  287. }
  288. void parameter_tree(parameter *the_parameter, int lv){
  289. parameter *tmp = the_parameter;
  290. if(the_parameter == NULL){
  291. print_lv(lv);
  292. fprintf(tree_info, "NULL\n");
  293. goto return_back;
  294. }
  295. while(1){
  296. if(tmp == NULL){
  297. break;
  298. }
  299. print_lv(lv);
  300. switch (tmp->type)
  301. {
  302. case only_value:
  303. fprintf(tree_info, "[only_value](parameter)\n");
  304. print_t("value\n", tmp->u.value);
  305. break;
  306. case put_args:
  307. fprintf(tree_info, "[put_args](parameter)\n");
  308. print_t("value\n", tmp->u.value);
  309. break;
  310. case put_kwargs:
  311. fprintf(tree_info, "[put_kwargs](parameter)\n");
  312. print_t("value\n", tmp->u.value);
  313. break;
  314. case name_value:
  315. fprintf(tree_info, "[name_value](parameter)\n");
  316. print_t("value\n", tmp->u.value);
  317. print_t("var\n", tmp->u.var);
  318. break;
  319. default:
  320. break;
  321. }
  322. tmp = tmp->next;
  323. }
  324. return_back: return;
  325. }
  326. void if_tree(if_list *the_branch, int lv){
  327. if_list *tmp = the_branch;
  328. if(the_branch == NULL){
  329. print_lv(lv);
  330. fprintf(tree_info, "NULL\n");
  331. goto return_back;
  332. }
  333. while(1){
  334. if(tmp == NULL){
  335. break;
  336. }
  337. print_lv(lv);
  338. fprintf(tree_info, "[if node]\n");
  339. print_t("condition\n", tmp->condition);
  340. print_t("done\n", tmp->done);
  341. tmp = tmp->next;
  342. }
  343. return_back: return;
  344. }