interpreter.c 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "../paser/y.tab.c"
  4. #include <math.h>
  5. // running code
  6. GWARF_result while_func(statement *, var_list *);
  7. GWARF_result operation_func(statement *, var_list *);
  8. GWARF_result add_func(GWARF_result, GWARF_result, var_list *);
  9. GWARF_result sub_func(GWARF_result, GWARF_result, var_list *);
  10. GWARF_result mul_func(GWARF_result, GWARF_result, var_list *);
  11. GWARF_result div_func(GWARF_result, GWARF_result, var_list *);
  12. GWARF_result pow_func(GWARF_result, GWARF_result, var_list *);
  13. GWARF_result log_func(GWARF_result, GWARF_result, var_list *);
  14. GWARF_result sqrt_func(GWARF_result, GWARF_result, var_list *);
  15. GWARF_result assigment_func(char *, GWARF_result, var_list *, int);
  16. GWARF_result equal_func(GWARF_result, GWARF_result, var_list *, int);
  17. GWARF_result if_func(if_list *, var_list *);
  18. GWARF_result for_func(statement *, var_list *);
  19. GWARF_result negative_func(GWARF_result, var_list *);
  20. int get_var_list_len(var_list *);
  21. GWARF_result block_func(statement *, var_list *);
  22. // math
  23. double log_(double, double);
  24. double log_(double base, double num){ // 自己定义一次log
  25. return log(num) / log(base);
  26. }
  27. double sqrt_(double, double);
  28. double sqrt_(double base, double num){ // 定义根号sqrt
  29. return pow(base, (1 / num));
  30. }
  31. // ---- var func
  32. var *make_var(){ // make var with base
  33. var *tmp;
  34. tmp = malloc(sizeof(var)); // get an address for base var
  35. tmp->name = ""; // can't get the name for the real var
  36. tmp->next = NULL;
  37. return tmp;
  38. }
  39. void append_var(char *name, GWARF_value value, var *base_var){
  40. int break_ = 1; // get var[2] or not[1]
  41. var *tmp = base_var; // iter var
  42. while(1){
  43. if (!strcmp(tmp->name, name)){
  44. break_ = 2;
  45. break;
  46. }
  47. if (tmp->next == NULL){ // not var name *name
  48. break_ = 1;
  49. break;
  50. }
  51. tmp = tmp->next; // get the next to iter
  52. }
  53. if(break_ == 2){
  54. tmp->value = value;
  55. return;
  56. }
  57. var *new_tmp = make_var();
  58. tmp->next = new_tmp;
  59. new_tmp->name = malloc(sizeof(name));
  60. strcpy(new_tmp->name, name);
  61. new_tmp->value = value;
  62. }
  63. void free_var(var *base_var){ // free the address
  64. var *tmp = base_var; // iter var
  65. while(1){
  66. if (tmp->next == NULL){ // the last
  67. free(tmp);
  68. break;
  69. }
  70. var *tmp_2 = tmp;
  71. tmp = tmp->next;
  72. free(tmp_2);
  73. }
  74. }
  75. var *get_var(char *name, var *base_var){ // get the address
  76. var *tmp = base_var; // iter var
  77. while(1){
  78. if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  79. return tmp;
  80. }
  81. if (tmp->next == NULL){ // not var name *name
  82. return NULL;
  83. }
  84. tmp = tmp->next; // get the next to iter
  85. }
  86. }
  87. void del_var(char *name, var *base_var){ // free an address
  88. var *tmp = base_var, *last_tmp=NULL; // iter var
  89. while(1){
  90. if (tmp->name == name){
  91. if(last_tmp != NULL){
  92. last_tmp->next = tmp->next; // if tmp->next is NULL last_tmp->next is NULL too
  93. }
  94. free(tmp);
  95. return;
  96. }
  97. if (tmp->next == NULL){ // not var name *name
  98. return;
  99. }
  100. tmp = tmp->next; // get the next to iter
  101. last_tmp = tmp;
  102. }
  103. }
  104. // --------------default_var
  105. default_var *make_default_var(){ // make_default_var
  106. default_var *tmp;
  107. tmp = malloc(sizeof(default_var)); // get an address for default_var
  108. tmp->next = NULL;
  109. return tmp;
  110. }
  111. default_var *make_default_var_base(){ // if
  112. default_var *tmp = make_default_var();
  113. tmp->name = "";
  114. tmp->from = 0;
  115. return tmp;
  116. }
  117. void append_default_var_base(char *name ,int from, default_var *base_default_var){ // elif
  118. default_var *start = base_default_var;
  119. while(1){
  120. if (!strcmp(start->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  121. puts("SECOND");
  122. return; // 不可以二次设置
  123. }
  124. if (start->next == NULL){ // not var name *name
  125. break;
  126. }
  127. start = start->next; // get the next to iter
  128. }
  129. default_var *tmp = make_default_var();
  130. tmp->name = name;
  131. tmp->from = from;
  132. start->next = tmp;
  133. return;
  134. }
  135. int get_default(char *name, default_var *base_default_var){ // get the address
  136. default_var *tmp = base_default_var; // iter var
  137. while(1){
  138. if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  139. return tmp->from;
  140. }
  141. if (tmp->next == NULL){ // not var name *name
  142. return 0;
  143. }
  144. tmp = tmp->next; // get the next to iter
  145. }
  146. }
  147. // ---- statement list
  148. statement *make_statement(){ // make statement
  149. statement *tmp;
  150. tmp = malloc(sizeof(statement)); // get an address for base var
  151. tmp->next = NULL;
  152. tmp->type = start;
  153. return tmp;
  154. }
  155. statement *append_statement(statement *base_statement, statement *new_tmp){ // make statement next
  156. statement *tmp = base_statement; // iter var
  157. while(1){
  158. if (tmp->next == NULL){ // not var name *name
  159. break;
  160. }
  161. tmp = tmp->next; // get the next to iter
  162. }
  163. tmp->next = new_tmp;
  164. return new_tmp;
  165. }
  166. // ---- var_list
  167. var_list *make_var_list(){ // make a empty var_list node
  168. var_list *tmp;
  169. tmp = malloc(sizeof(var_list)); // get an address for base var
  170. tmp->next = NULL;
  171. tmp->var_base = NULL;
  172. tmp->default_list = make_default_var_base();
  173. return tmp;
  174. }
  175. var_list *make_var_base(var *gloabl_var){ // make the base for global_var
  176. var_list *tmp = make_var_list();
  177. tmp->var_base = gloabl_var;
  178. return tmp;
  179. }
  180. var_list *append_var_list(var *var_base, var_list *var_list_base){ // make var_list[FILO]
  181. var_list *tmp = make_var_list();
  182. tmp->var_base = var_base;
  183. tmp->next = var_list_base;
  184. return tmp;
  185. }
  186. var_list *free_var_list(var_list *var_list_base){ // free one var_list[FILO]
  187. var_list *tmp = var_list_base->next;
  188. if(tmp==NULL){
  189. return var_list_base;
  190. }
  191. free(var_list_base);
  192. return tmp;
  193. }
  194. int get_var_list_len(var_list *var_base){
  195. var_list *start = var_base;
  196. int tmp = 0;
  197. while(1){
  198. if(start->next == NULL){
  199. break;
  200. }
  201. start = start->next;
  202. tmp += 1;
  203. }
  204. return tmp;
  205. }
  206. var *find_var(var_list *var_base,int from, char *name){ // find var by func get_var in var_list[iter to find]
  207. var_list *start = var_base;
  208. var *return_var;
  209. from += get_default(name, var_base->default_list);
  210. printf("find from = %d\n", from);
  211. for(int i = 0;i < from;i+= 1){
  212. if(start->next == NULL){
  213. break;
  214. }
  215. start = start->next;
  216. }
  217. printf("----find address = %d----\n", start);
  218. while (1)
  219. {
  220. return_var = get_var(name, start->var_base);
  221. if((return_var == NULL) && (start->next == NULL)){ // don't get the var and not next
  222. return NULL;
  223. }
  224. else if((return_var == NULL) && (start->next != NULL)){ // don't get the var but can next
  225. start = start->next;
  226. continue;
  227. }
  228. return return_var; //get var success can or can't next
  229. }
  230. }
  231. void add_var(var_list *var_base,int from, char *name, GWARF_value value){ // add var by func append_var in var_list[iter to find]
  232. var_list *start = var_base;
  233. var *return_var;
  234. printf("base from = %d\n", from);
  235. from += get_default(name, var_base->default_list);
  236. printf("add from = %d\n", from);
  237. for(int i = 0;i < from;i+= 1){
  238. if(start->next == NULL){
  239. break;
  240. }
  241. start = start->next;
  242. }
  243. printf("----add address = %d----\n", start);
  244. append_var(name, value, start->var_base);
  245. }
  246. // ---- statement_list
  247. statement_list *make_statement_list(){ // make a empty var_list node
  248. statement_list *tmp;
  249. tmp = malloc(sizeof(statement_list)); // get an address for base var
  250. tmp->next = NULL;
  251. tmp->statement_base = NULL;
  252. return tmp;
  253. }
  254. statement_list *make_statement_base(statement *gloabl_code){
  255. statement_list *tmp = make_statement_list();
  256. tmp->statement_base = gloabl_code;
  257. return tmp;
  258. }
  259. statement_list *append_statement_list(statement *statement_base, statement_list *statment_list_base){ // make var_list[FILO]
  260. statement_list *tmp = make_statement_list();
  261. tmp->statement_base = statement_base;
  262. tmp->next = statment_list_base;
  263. return tmp;
  264. }
  265. statement *find_statement_list(int from, statement_list *statment_list_base){ // find var by func get_var in var_list[iter to find]
  266. statement_list *start = statment_list_base;
  267. for(int i = 0;i < from;i+= 1){
  268. if(start->next == NULL){
  269. break;
  270. }
  271. start = start->next;
  272. }
  273. return start->statement_base;
  274. }
  275. statement_list *free_statement_list(statement_list *statment_list_base){ // make var_list[FILO]
  276. statement_list *tmp = statment_list_base->next;
  277. if(tmp != NULL){
  278. free(statment_list_base);
  279. return tmp;
  280. }
  281. return statment_list_base;
  282. }
  283. // ---- if_list
  284. if_list *make_base_if(){ // make base if
  285. if_list *tmp;
  286. tmp = malloc(sizeof(if_list)); // get an address for base var
  287. tmp->next = NULL;
  288. tmp->done = NULL;
  289. tmp->condition = NULL;
  290. return tmp;
  291. }
  292. if_list *make_if(statement *condition, statement *done_base){ // if
  293. if_list *tmp = make_base_if();
  294. tmp->done = done_base;
  295. tmp->condition = condition;
  296. return tmp;
  297. }
  298. if_list *append_elif(if_list *tmp ,if_list *base_if_list){ // elif
  299. if_list *start = base_if_list;
  300. while(1){
  301. if(start->next == NULL){
  302. break;
  303. }
  304. start = start->next;
  305. }
  306. start->next = tmp;
  307. return tmp;
  308. }
  309. // ---- run code
  310. GWARF_result read_statement_list(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  311. GWARF_result return_value;
  312. return_value.u = statement_end; // 正常设置[正常语句结束]
  313. return_value.value.type = NUMBER_value; // 默认设置
  314. return_value.value.value.double_value = 0; // 默认设置
  315. switch (the_statement->type)
  316. {
  317. case operation: // 表达式运算
  318. puts("----code----");
  319. return_value = operation_func(the_statement, the_var);
  320. if((return_value.value.type == INT_value) || (return_value.value.type == BOOL_value)){
  321. printf("operation value = %d\n", return_value.value.value.int_value);
  322. }
  323. else if(return_value.value.type == NUMBER_value){
  324. printf("operation value = %f\n", return_value.value.value.double_value);
  325. }
  326. else{
  327. printf("operation value = %s\n", return_value.value.value.string);
  328. }
  329. puts("----stop code----");
  330. break;
  331. case while_cycle:
  332. puts("----while code----");
  333. return_value = while_func(the_statement, the_var);
  334. puts("----stop while code----");
  335. break;
  336. case for_cycle:
  337. puts("----for code----");
  338. return_value = for_func(the_statement, the_var);
  339. puts("----for while code----");
  340. break;
  341. case if_branch:
  342. puts("----if code----");
  343. return_value = if_func(the_statement->code.if_branch.done, the_var);
  344. puts("----stop if code----");
  345. break;
  346. case base_value: // get value[所有字面量均为这个表达式]
  347. return_value.value = (the_statement->code).base_value.value; // code
  348. if((return_value.value.type == INT_value) || (return_value.value.type == BOOL_value)){
  349. printf("get value = %d\n", return_value.value.value.int_value);
  350. }
  351. else if(return_value.value.type == NUMBER_value){
  352. printf("get value = %f\n", return_value.value.value.double_value);
  353. }
  354. else{
  355. printf("get value = %s\n", return_value.value.value.string);
  356. }
  357. break;
  358. case base_var:{ // because the var tmp, we should ues a {} to make a block[name space] for the tmp var;
  359. int from = 0;
  360. if((the_statement->code).base_var.from == NULL){
  361. from = 0;
  362. }
  363. else{
  364. from = (int)traverse((the_statement->code).base_var.from, the_var, false).value.value.double_value;
  365. }
  366. var *tmp = find_var(the_var, from, (the_statement->code).base_var.var_name);
  367. if(tmp == NULL){
  368. return_value.u = name_no_found; // nameerror
  369. }
  370. else
  371. {
  372. return_value.value = tmp->value; // get_var
  373. if((return_value.value.type == INT_value) || (return_value.value.type == BOOL_value)){
  374. printf("var value = %d\n", return_value.value.value.int_value);
  375. }
  376. else if(return_value.value.type == NUMBER_value){
  377. printf("var value = %f\n", return_value.value.value.double_value);
  378. }
  379. else{
  380. printf("var value = %s\n", return_value.value.value.string);
  381. }
  382. }
  383. break;
  384. }
  385. case break_cycle:
  386. return_value.u = cycle_break;
  387. return_value.value.type = INT_value;
  388. if(the_statement->code.break_cycle.times == NULL){
  389. return_value.value.value.int_value = 0;
  390. }
  391. else{
  392. int int_tmp;
  393. GWARF_result tmp_result = traverse(the_statement->code.break_cycle.times, the_var, false);
  394. if(tmp_result.value.type == INT_value){
  395. int_tmp = tmp_result.value.value.int_value;
  396. }
  397. else{
  398. int_tmp = (int)tmp_result.value.value.double_value;
  399. }
  400. return_value.value.value.int_value = int_tmp;
  401. }
  402. break;
  403. case broken:
  404. return_value.u = code_broken;
  405. return_value.value.type = INT_value;
  406. if(the_statement->code.broken.times == NULL){
  407. return_value.value.value.int_value = 0;
  408. }
  409. else{
  410. GWARF_result tmp_result = traverse(the_statement->code.broken.times, the_var, false);
  411. int int_tmp;
  412. if(tmp_result.value.type == INT_value){
  413. int_tmp = tmp_result.value.value.int_value;
  414. }
  415. else{
  416. int_tmp = (int)tmp_result.value.value.double_value;
  417. }
  418. return_value.value.value.int_value = int_tmp;
  419. }
  420. break;
  421. case continue_cycle:
  422. return_value.u = cycle_continue;
  423. return_value.value.type = INT_value;
  424. if(the_statement->code.continue_cycle.times == NULL){
  425. return_value.value.value.int_value = 0;
  426. }
  427. else{
  428. GWARF_result tmp_result = traverse(the_statement->code.continue_cycle.times, the_var, false);
  429. int int_tmp;
  430. if(tmp_result.value.type == INT_value){
  431. int_tmp = tmp_result.value.value.int_value;
  432. }
  433. else{
  434. int_tmp = (int)tmp_result.value.value.double_value;
  435. }
  436. return_value.value.value.int_value = int_tmp;
  437. }
  438. break;
  439. case continued:
  440. return_value.u = code_continued;
  441. return_value.value.type = INT_value;
  442. if(the_statement->code.continued.times == NULL){
  443. return_value.value.value.int_value = 0;
  444. }
  445. else{
  446. GWARF_result tmp_result = traverse(the_statement->code.continued.times, the_var, false);
  447. int int_tmp;
  448. if(tmp_result.value.type == INT_value){
  449. int_tmp = tmp_result.value.value.int_value;
  450. }
  451. else{
  452. int_tmp = (int)tmp_result.value.value.double_value;
  453. }
  454. return_value.value.value.int_value = int_tmp;
  455. }
  456. break;
  457. case restart:
  458. return_value.u = cycle_restart;
  459. return_value.value.type = INT_value;
  460. if(the_statement->code.restart.times == NULL){
  461. return_value.value.value.int_value = 0;
  462. }
  463. else{
  464. GWARF_result tmp_result = traverse(the_statement->code.restart.times, the_var, false);
  465. int int_tmp;
  466. if(tmp_result.value.type == INT_value){
  467. int_tmp = tmp_result.value.value.int_value;
  468. }
  469. else{
  470. int_tmp = (int)tmp_result.value.value.double_value;
  471. }
  472. return_value.value.value.int_value = int_tmp;
  473. }
  474. break;
  475. case restarted:
  476. return_value.u = code_restarted;
  477. return_value.value.type = INT_value;
  478. if(the_statement->code.restarted.times == NULL){
  479. return_value.value.value.int_value = 0;
  480. }
  481. else{
  482. GWARF_result tmp_result = traverse(the_statement->code.restarted.times, the_var, false);
  483. int int_tmp;
  484. if(tmp_result.value.type == INT_value){
  485. int_tmp = tmp_result.value.value.int_value;
  486. }
  487. else{
  488. int_tmp = (int)tmp_result.value.value.double_value;
  489. }
  490. return_value.value.value.int_value = int_tmp;
  491. }
  492. break;
  493. case rewent:
  494. return_value.u = code_rewent; // rego but not now
  495. break;
  496. case rego:
  497. return_value.u = code_rego; // rego now
  498. break;
  499. case set_default:{
  500. char *name = the_statement->code.set_default.name;
  501. GWARF_result tmp_result = traverse(the_statement->code.set_default.times, the_var, false);
  502. int base_from;
  503. if(tmp_result.value.type == INT_value){
  504. base_from = tmp_result.value.value.int_value;
  505. }
  506. else{
  507. base_from = (int)tmp_result.value.value.double_value;
  508. }
  509. append_default_var_base(name, base_from, the_var->default_list);
  510. printf("set_default for %s\n", name);
  511. break;
  512. }
  513. case set_global:{
  514. char *name = the_statement->code.set_global.name;
  515. int base_from = get_var_list_len(the_var);
  516. append_default_var_base(name, base_from, the_var->default_list);
  517. printf("global for %s\n", name);
  518. break;
  519. }
  520. case set_nonlocal:{
  521. char *name = the_statement->code.set_global.name;
  522. append_default_var_base(name, 1, the_var->default_list);
  523. printf("nonlocal for %s\n", name);
  524. break;
  525. }
  526. case code_block:
  527. puts("----block code----");
  528. return_value = block_func(the_statement, the_var);
  529. puts("----stop block code----");
  530. break;
  531. default:
  532. puts("default");
  533. break;
  534. }
  535. return return_value;
  536. }
  537. // -----------------if func
  538. GWARF_result if_func(if_list *if_base, var_list *the_var){ // read the statement list with case to run by func
  539. GWARF_result value;
  540. if_list *start;
  541. again: start = if_base;
  542. bool rego = false; // switch...case...
  543. while(1){
  544. if(start->condition == NULL){ // else
  545. else_restart:
  546. puts("----else----");
  547. value = traverse(start->done, the_var, true);
  548. puts("----stop else----");
  549. // restarted操作
  550. if(value.u == code_restarted){
  551. if(value.value.value.int_value <= 0){
  552. puts("----restarted real----");
  553. value.u = statement_end;
  554. goto else_restart;
  555. }
  556. else{
  557. value.value.value.int_value -= 1;
  558. break;
  559. }
  560. }
  561. // continued操作
  562. if(value.u == code_continued){
  563. if(value.value.value.int_value <= 0){
  564. puts("----if continue real----");
  565. value.u = statement_end;
  566. goto again;
  567. }
  568. else{
  569. value.value.value.int_value -= 1;
  570. }
  571. break;
  572. }
  573. // broken操作
  574. if(value.u == code_broken){
  575. value.value.value.int_value -= 1;
  576. if(value.value.value.int_value < 0){
  577. value.u = statement_end; // 正常设置[正常语句结束]
  578. }
  579. break;
  580. }
  581. // rego操作
  582. // else层的rego和rewent是可以往上层遗传的[也就是else如果显式指定rego和rewent是会遗传的,但是如果是if或elif指定rego是不会遗传的]
  583. if((value.u == code_rewent) || (value.u == code_rego)){
  584. ;
  585. }
  586. break; // else not next and don't need rego
  587. }
  588. else{ // not else
  589. GWARF_result condition;
  590. condition = traverse(start->condition, the_var, false);
  591. if(rego || (condition.value.value.double_value)){ // condition run success or rego(condition won't do) bug rewent can
  592. if_restart:
  593. puts("----if----");
  594. value = traverse(start->done, the_var, true);
  595. puts("----stop if----");
  596. // restarted操作
  597. if(value.u == code_restarted){
  598. if(value.value.value.int_value <= 0){
  599. puts("----restarted real----");
  600. value.u = statement_end;
  601. goto if_restart;
  602. }
  603. else{
  604. value.value.value.int_value -= 1;
  605. break;
  606. }
  607. }
  608. // continued操作 [设在在rewent和rego前面]
  609. if(value.u == code_continued){
  610. if(value.value.value.int_value <= 0){
  611. puts("----if continue real----");
  612. value.u = statement_end;
  613. goto again;
  614. }
  615. else{
  616. value.value.value.int_value -= 1;
  617. }
  618. break;
  619. }
  620. // broken操作
  621. if(value.u == code_broken){
  622. value.value.value.int_value -= 1;
  623. if(value.value.value.int_value < 0){
  624. value.u = statement_end; // 正常设置[正常语句结束]
  625. }
  626. break;
  627. }
  628. // rego操作
  629. if((value.u == code_rewent) || (value.u == code_rego)){
  630. value.u = statement_end; // 设置为正常语句
  631. rego = true;
  632. }
  633. // not restarted -> if is rego
  634. if(!rego){
  635. break; // don't rego
  636. }
  637. }
  638. }
  639. if(start->next == NULL){ // not next
  640. break;
  641. }
  642. start = start->next;
  643. }
  644. if((value.u == cycle_continue) || (value.u == cycle_restart) || (value.u == cycle_break)){ // if不处理也不计入层次 同break一样
  645. ;
  646. }
  647. return value;
  648. }
  649. // -----------------for func
  650. GWARF_result for_func(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  651. GWARF_result value, condition;
  652. if(the_statement->code.for_cycle.first != NULL){
  653. traverse(the_statement->code.for_cycle.first, the_var, false); // first to do
  654. }
  655. while (1){
  656. if(the_statement->code.for_cycle.condition != NULL){ // 检查是否存在循环条件
  657. condition = traverse(the_statement->code.for_cycle.condition, the_var, false);
  658. printf("for condition = %f\n", condition.value.value.double_value);
  659. if(!condition.value.value.double_value){
  660. break;
  661. }
  662. }
  663. restart_again:
  664. puts("----for----");
  665. value = traverse(the_statement->code.for_cycle.done, the_var, true);
  666. //break操作
  667. if((value.u == cycle_break) || (value.u == code_broken)){
  668. printf("cycle_break(broken) %f\n", value.value.value.int_value);
  669. value.value.value.int_value -= 1;
  670. if(value.value.value.int_value < 0){
  671. value.u = statement_end; // 正常设置[正常语句结束]
  672. }
  673. break; // break don't need after do
  674. }
  675. puts("----stop for----");
  676. // after do
  677. if(the_statement->code.for_cycle.after != NULL){
  678. traverse(the_statement->code.for_cycle.after, the_var, false);
  679. }
  680. // continue操作
  681. if((value.u == cycle_continue) || (value.u == code_continued)){
  682. if(value.value.value.int_value <= 0){
  683. puts("----continue real----");
  684. value.u = statement_end;
  685. continue;
  686. }
  687. else{
  688. value.value.value.int_value -= 1;
  689. break;
  690. }
  691. }
  692. // restart操作
  693. if((value.u == cycle_restart) || (value.u == code_restarted)){
  694. if(value.value.value.int_value <= 0){
  695. puts("----restart real----");
  696. value.u = statement_end;
  697. goto restart_again;
  698. }
  699. else{
  700. value.value.value.int_value -= 1;
  701. break;
  702. }
  703. }
  704. }
  705. return value;
  706. }
  707. // -----------------block func
  708. GWARF_result block_func(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  709. GWARF_result value, condition;
  710. again:
  711. puts("----block----");
  712. value = traverse(the_statement->code.code_block.done, the_var, true);
  713. puts("----stop block----");
  714. // restart操作[和continue效果相同]
  715. if(value.u == code_restarted){
  716. if(value.value.value.int_value <= 0){
  717. puts("----restarted real----");
  718. value.u = statement_end;
  719. goto again;
  720. }
  721. else{
  722. value.value.value.int_value -= 1;
  723. }
  724. }
  725. // continued操作
  726. if(value.u == code_continued){
  727. if(value.value.value.int_value <= 0){
  728. puts("----if continue real----");
  729. value.u = statement_end;
  730. goto again;
  731. }
  732. else{
  733. value.value.value.int_value -= 1;
  734. }
  735. }
  736. // broken操作
  737. if(value.u == code_broken){
  738. value.value.value.int_value -= 1;
  739. if(value.value.value.int_value < 0){
  740. value.u = statement_end; // 正常设置[正常语句结束]
  741. }
  742. }
  743. return value;
  744. }
  745. // -----------------while func
  746. GWARF_result while_func(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  747. GWARF_result value, condition;
  748. while (1){
  749. condition = traverse(the_statement->code.while_cycle.condition, the_var, false);
  750. printf("while condition = %f\n", condition.value.value.double_value);
  751. if(!condition.value.value.double_value){
  752. break;
  753. }
  754. restart_again:
  755. puts("----while----");
  756. value = traverse(the_statement->code.while_cycle.done, the_var, true);
  757. puts("----stop while----");
  758. // break的操作
  759. if((value.u == cycle_break) || (value.u == code_broken)){
  760. printf("cycle_break(broken) %f\n", value.value.value.int_value);
  761. value.value.value.int_value -= 1;
  762. if(value.value.value.int_value < 0){
  763. value.u = statement_end; // 正常设置[正常语句结束]
  764. }
  765. }
  766. // continue的操作
  767. if((value.u == cycle_continue) || (value.u == code_continued)){
  768. if(value.value.value.int_value <= 0){
  769. puts("----continue real----");
  770. value.u = statement_end;
  771. continue;
  772. }
  773. else{
  774. value.value.value.int_value -= 1;
  775. break;
  776. }
  777. }
  778. // restart的操作
  779. if((value.u == cycle_restart) || (value.u == code_restarted)){
  780. if(value.value.value.int_value <= 0){
  781. puts("----restart real----");
  782. value.u = statement_end;
  783. goto restart_again;
  784. }
  785. else{
  786. value.value.value.int_value -= 1;
  787. break;
  788. }
  789. }
  790. }
  791. return value;
  792. }
  793. // -----------------operation func
  794. GWARF_result operation_func(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  795. GWARF_result value, left_result, right_result;
  796. int func_type = the_statement->code.operation.type;
  797. if((func_type != ASSIGMENT_func) && (func_type != NEGATIVE_func)){ // don't run because I don't need[if it's and func ,it will be run twice]
  798. left_result = traverse((*the_statement).code.operation.left_exp, the_var, false);
  799. }
  800. right_result = traverse((*the_statement).code.operation.right_exp, the_var, false);
  801. switch (func_type) // 获取运算类型
  802. {
  803. case ADD_func:
  804. value = add_func(left_result, right_result, the_var);
  805. break;
  806. case SUB_func:
  807. value = sub_func(left_result, right_result, the_var);
  808. break;
  809. case MUL_func:
  810. value = mul_func(left_result, right_result, the_var);
  811. break;
  812. case DIV_func:
  813. value = div_func(left_result, right_result, the_var);
  814. break;
  815. case NEGATIVE_func:
  816. value = negative_func(right_result, the_var);
  817. break;
  818. case ASSIGMENT_func:{ // because the var char, we should ues a {} to make a block[name space] for the tmp var;
  819. char *left = (the_statement->code.operation.left_exp)->code.base_var.var_name; // get var name but not value
  820. int from = 0;
  821. if((the_statement->code.operation.left_exp)->code.base_var.from == NULL){
  822. from = 0;
  823. }
  824. else{
  825. GWARF_result tmp_result = traverse((the_statement->code.operation.left_exp)->code.base_var.from, the_var, false);
  826. if(tmp_result.value.type = INT_value){
  827. from = tmp_result.value.value.int_value;
  828. }
  829. else{
  830. from = (int)tmp_result.value.value.double_value;
  831. }
  832. }
  833. value = assigment_func(left, right_result, the_var, from);
  834. break;
  835. }
  836. case EQUAL_func:
  837. value = equal_func(left_result, right_result, the_var, 0);
  838. break;
  839. case MORE_func:
  840. value = equal_func(left_result, right_result, the_var, 1);
  841. break;
  842. case LESS_func:
  843. value = equal_func(left_result, right_result, the_var, 2);
  844. break;
  845. case MOREEQ_func:
  846. value = equal_func(left_result, right_result, the_var, 3);
  847. break;
  848. case LESSEQ_func:
  849. value = equal_func(left_result, right_result, the_var, 4);
  850. break;
  851. case NOTEQ_func:
  852. value = equal_func(left_result, right_result, the_var, 5);
  853. break;
  854. case POW_func:
  855. value = pow_func(left_result, right_result, the_var);
  856. break;
  857. case LOG_func:
  858. value = log_func(left_result, right_result, the_var);
  859. break;
  860. case SQRT_func:
  861. value = sqrt_func(left_result, right_result, the_var);
  862. break;
  863. default:
  864. break;
  865. }
  866. value.u = statement_end; // 正常设置[正常语句结束]
  867. return value;
  868. }
  869. // --------- ADD
  870. GWARF_result add_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for add and call from read_statement_list
  871. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for add
  872. if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is INT
  873. return_value.u = return_def;
  874. return_value.value.type = INT_value;
  875. return_value.value.value.int_value = (int)(left_result.value.value.int_value + right_result.value.value.int_value);
  876. }
  877. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  878. return_value.u = return_def;
  879. return_value.value.type = NUMBER_value;
  880. return_value.value.value.double_value = (double)(left_result.value.value.double_value + right_result.value.value.double_value);
  881. }
  882. else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  883. return_value.u = return_def;
  884. return_value.value.type = NUMBER_value;
  885. return_value.value.value.double_value = (double)(left_result.value.value.int_value + right_result.value.value.double_value);
  886. }
  887. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is NUMBER
  888. return_value.u = return_def;
  889. return_value.value.type = NUMBER_value;
  890. return_value.value.value.double_value = (double)(left_result.value.value.double_value + right_result.value.value.int_value);
  891. }
  892. else if((left_result.value.type == STRING_value) && (right_result.value.type == STRING_value)){ // all is NUMBER
  893. return_value.u = return_def;
  894. return_value.value.type = STRING_value;
  895. char *l = left_result.value.value.string;
  896. char *r = right_result.value.value.string;
  897. return_value.value.value.string = malloc(strlen(l) + strlen(r)); // 创建新空间
  898. strcpy(return_value.value.value.string, l); // 复制字符串
  899. strcat(return_value.value.value.string, r); // 追加字符串
  900. }
  901. return return_value;
  902. }
  903. // --------- SUB
  904. GWARF_result sub_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for sub and call from read_statement_list
  905. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for sub
  906. if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is INT
  907. return_value.u = return_def;
  908. return_value.value.type = INT_value;
  909. return_value.value.value.int_value = (int)(left_result.value.value.int_value - right_result.value.value.int_value);
  910. }
  911. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  912. return_value.u = return_def;
  913. return_value.value.type = NUMBER_value;
  914. return_value.value.value.double_value = (double)(left_result.value.value.double_value - right_result.value.value.double_value);
  915. }
  916. else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  917. return_value.u = return_def;
  918. return_value.value.type = NUMBER_value;
  919. return_value.value.value.double_value = (double)(left_result.value.value.int_value - right_result.value.value.double_value);
  920. }
  921. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is NUMBER
  922. return_value.u = return_def;
  923. return_value.value.type = NUMBER_value;
  924. return_value.value.value.double_value = (double)(left_result.value.value.double_value - right_result.value.value.int_value);
  925. }
  926. return return_value;
  927. }
  928. // --------- negative
  929. GWARF_result negative_func(GWARF_result right_result, var_list *the_var){ // the func for sub and call from read_statement_list
  930. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for sub
  931. if(right_result.value.type == INT_value || right_result.value.type == BOOL_value){ // all is INT
  932. return_value.u = return_def;
  933. return_value.value.type = INT_value;
  934. return_value.value.value.int_value = (int)(-1 * right_result.value.value.int_value);
  935. }
  936. else if(right_result.value.type == NUMBER_value){ // all is NUMBER
  937. return_value.u = return_def;
  938. return_value.value.type = NUMBER_value;
  939. return_value.value.value.double_value = (double)(-1 * right_result.value.value.double_value);
  940. }
  941. else if(right_result.value.type == STRING_value){ // 字符串
  942. return_value.u = return_def;
  943. return_value.value.type = STRING_value;
  944. char *r = right_result.value.value.string;
  945. return_value.value.value.string = malloc(strlen(r)); // 创建新空间
  946. char *tmp = malloc(strlen(r));
  947. strcpy(tmp, r); // 复制字符串
  948. for(int i=0;i<strlen(tmp);i += 1){
  949. return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1]; // 反转
  950. }
  951. }
  952. return return_value;
  953. }
  954. // --------- MUL
  955. GWARF_result mul_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for mul and call from read_statement_list
  956. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for mul
  957. if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is INT
  958. return_value.u = return_def;
  959. return_value.value.type = INT_value;
  960. return_value.value.value.int_value = (int)(left_result.value.value.int_value * right_result.value.value.int_value);
  961. }
  962. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  963. return_value.u = return_def;
  964. return_value.value.type = NUMBER_value;
  965. return_value.value.value.double_value = (double)(left_result.value.value.double_value * right_result.value.value.double_value);
  966. }
  967. else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  968. return_value.u = return_def;
  969. return_value.value.type = NUMBER_value;
  970. return_value.value.value.double_value = (double)(left_result.value.value.int_value * right_result.value.value.double_value);
  971. }
  972. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is NUMBER
  973. return_value.u = return_def;
  974. return_value.value.type = NUMBER_value;
  975. return_value.value.value.double_value = (double)(left_result.value.value.double_value * right_result.value.value.int_value);
  976. }
  977. else if((left_result.value.type == INT_value) && (right_result.value.type == STRING_value)){ // all is NUMBER
  978. return_value.u = return_def;
  979. return_value.value.type = STRING_value;
  980. int l = left_result.value.value.int_value;
  981. char *r = right_result.value.value.string;
  982. if(l == 0){
  983. return_value.value.value.string = (char *)malloc(0); // NULL string
  984. }
  985. else if(l > 0){
  986. return_value.value.value.string = malloc(strlen(r) * l); // 创建新空间
  987. strcpy(return_value.value.value.string, r); // 复制字符串
  988. l -= 1;
  989. for(;l>0;l -= 1){
  990. strcat(return_value.value.value.string, r); // 追加字符串
  991. }
  992. }
  993. else{
  994. return_value.value.value.string = malloc(strlen(r) * (-l)); // 创建新空间
  995. char *tmp = malloc(strlen(r) * (-l));
  996. strcpy(tmp, r); // 复制字符串
  997. l += 1;
  998. for(;l<0;l += 1){
  999. strcat(tmp, r); // 追加字符串
  1000. }
  1001. for(int i=0;i<strlen(tmp);i += 1){
  1002. return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1]; // 反转
  1003. }
  1004. }
  1005. }
  1006. else if((left_result.value.type == STRING_value) && (right_result.value.type == INT_value)){ // all is NUMBER
  1007. return_value.u = return_def;
  1008. return_value.value.type = STRING_value;
  1009. int l = right_result.value.value.int_value;
  1010. char *r = left_result.value.value.string;
  1011. if(l == 0){
  1012. return_value.value.value.string = (char *)malloc(0); // NULL string
  1013. }
  1014. else if(l > 0){
  1015. return_value.value.value.string = malloc(strlen(r) * l); // 创建新空间
  1016. strcpy(return_value.value.value.string, r); // 复制字符串
  1017. l -= 1;
  1018. for(;l>0;l -= 1){
  1019. strcat(return_value.value.value.string, r); // 追加字符串
  1020. }
  1021. }
  1022. else{
  1023. return_value.value.value.string = malloc(strlen(r) * (-l)); // 创建新空间
  1024. char *tmp = malloc(strlen(r) * (-l));
  1025. strcpy(tmp, r); // 复制字符串
  1026. l += 1;
  1027. for(;l<0;l += 1){
  1028. strcat(tmp, r); // 追加字符串
  1029. }
  1030. for(int i=0;i<strlen(tmp);i += 1){
  1031. return_value.value.value.string[i] = tmp[strlen(tmp) - i - 1]; // 反转
  1032. }
  1033. }
  1034. }
  1035. return return_value;
  1036. }
  1037. // --------- DIV
  1038. GWARF_result div_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for div and call from read_statement_list
  1039. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for div
  1040. if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is INT
  1041. return_value.u = return_def;
  1042. return_value.value.type = INT_value;
  1043. return_value.value.value.int_value = (int)(left_result.value.value.int_value / right_result.value.value.int_value);
  1044. }
  1045. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  1046. return_value.u = return_def;
  1047. return_value.value.type = NUMBER_value;
  1048. return_value.value.value.double_value = (double)(left_result.value.value.double_value / right_result.value.value.double_value);
  1049. }
  1050. else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  1051. return_value.u = return_def;
  1052. return_value.value.type = NUMBER_value;
  1053. return_value.value.value.double_value = (double)(left_result.value.value.int_value / right_result.value.value.double_value);
  1054. }
  1055. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is NUMBER
  1056. return_value.u = return_def;
  1057. return_value.value.type = NUMBER_value;
  1058. return_value.value.value.double_value = (double)(left_result.value.value.double_value / right_result.value.value.int_value);
  1059. }
  1060. return return_value;
  1061. }
  1062. // --------- POW
  1063. GWARF_result pow_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for div and call from read_statement_list
  1064. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for div
  1065. if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is INT
  1066. return_value.u = return_def;
  1067. return_value.value.type = INT_value;
  1068. return_value.value.value.int_value = (int)pow((double)left_result.value.value.int_value, (double)right_result.value.value.int_value);
  1069. }
  1070. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  1071. return_value.u = return_def;
  1072. return_value.value.type = NUMBER_value;
  1073. return_value.value.value.double_value = (double)pow(left_result.value.value.double_value, right_result.value.value.double_value);
  1074. }
  1075. else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  1076. return_value.u = return_def;
  1077. return_value.value.type = NUMBER_value;
  1078. return_value.value.value.double_value = (double)pow((double)left_result.value.value.int_value, (double)right_result.value.value.double_value);
  1079. }
  1080. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is NUMBER
  1081. return_value.u = return_def;
  1082. return_value.value.type = NUMBER_value;
  1083. return_value.value.value.double_value = (double)pow((double)left_result.value.value.double_value, (double)right_result.value.value.int_value);
  1084. }
  1085. return return_value;
  1086. }
  1087. // --------- LOG
  1088. GWARF_result log_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for div and call from read_statement_list
  1089. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for div
  1090. if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is INT
  1091. return_value.u = return_def;
  1092. return_value.value.type = INT_value;
  1093. return_value.value.value.int_value = (int)log_((double)left_result.value.value.int_value, (double)right_result.value.value.int_value);
  1094. }
  1095. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  1096. return_value.u = return_def;
  1097. return_value.value.type = NUMBER_value;
  1098. return_value.value.value.double_value = (double)log_(left_result.value.value.double_value, right_result.value.value.double_value);
  1099. }
  1100. else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  1101. return_value.u = return_def;
  1102. return_value.value.type = NUMBER_value;
  1103. return_value.value.value.double_value = (double)log_((double)left_result.value.value.int_value, (double)right_result.value.value.double_value);
  1104. }
  1105. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is NUMBER
  1106. return_value.u = return_def;
  1107. return_value.value.type = NUMBER_value;
  1108. return_value.value.value.double_value = (double)log_((double)left_result.value.value.double_value, (double)right_result.value.value.int_value);
  1109. }
  1110. return return_value;
  1111. }
  1112. // --------- SQRT
  1113. GWARF_result sqrt_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var){ // the func for div and call from read_statement_list
  1114. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for div
  1115. if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is INT
  1116. return_value.u = return_def;
  1117. return_value.value.type = INT_value;
  1118. return_value.value.value.int_value = (int)sqrt_((double)left_result.value.value.int_value, (double)right_result.value.value.int_value);
  1119. }
  1120. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  1121. return_value.u = return_def;
  1122. return_value.value.type = NUMBER_value;
  1123. return_value.value.value.double_value = (double)sqrt_(left_result.value.value.double_value, right_result.value.value.double_value);
  1124. }
  1125. else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  1126. return_value.u = return_def;
  1127. return_value.value.type = NUMBER_value;
  1128. return_value.value.value.double_value = (double)sqrt_((double)left_result.value.value.int_value, (double)right_result.value.value.double_value);
  1129. }
  1130. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is NUMBER
  1131. return_value.u = return_def;
  1132. return_value.value.type = NUMBER_value;
  1133. return_value.value.value.double_value = (double)sqrt_((double)left_result.value.value.double_value, (double)right_result.value.value.int_value);
  1134. }
  1135. return return_value;
  1136. }
  1137. // --------- ASSIGMENT
  1138. GWARF_result assigment_func(char *left, GWARF_result right_result, var_list *the_var, int from){ // the func for assigment and call from read_statement_list
  1139. add_var(the_var, from, left, right_result.value);
  1140. return right_result;
  1141. }
  1142. // --------- EQUAL
  1143. GWARF_result equal_func(GWARF_result left_result, GWARF_result right_result, var_list *the_var, int type){ // the func for equal and call from read_statement_list
  1144. GWARF_result return_value;
  1145. int return_bool = 1;
  1146. return_value.u = return_def;
  1147. if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is INT
  1148. return_value.value.type = INT_value;
  1149. if ((left_result.value.value.int_value == right_result.value.value.int_value) && (type == 0)){ // 如果相等
  1150. return_bool = true; // 返回1 否则(默认)为0
  1151. }
  1152. if ((left_result.value.value.int_value > right_result.value.value.int_value) && (type == 1)){ // 如果大于
  1153. return_bool = true; // 返回1 否则(默认)为0
  1154. }
  1155. if ((left_result.value.value.int_value < right_result.value.value.int_value) && (type == 2)){ // 如果小于
  1156. return_bool = true; // 返回1 否则(默认)为0
  1157. }
  1158. if ((left_result.value.value.int_value >= right_result.value.value.int_value) && (type == 3)){ // 如果大于等于
  1159. return_bool = true; // 返回1 否则(默认)为0
  1160. }
  1161. if ((left_result.value.value.int_value <= right_result.value.value.int_value) && (type == 4)){ // 如果小于等于
  1162. return_bool = true; // 返回1 否则(默认)为0
  1163. }
  1164. if ((left_result.value.value.int_value != right_result.value.value.int_value) && (type == 5)){ // 如果不相等
  1165. return_bool = true; // 返回1 否则(默认)为0
  1166. }
  1167. }
  1168. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  1169. return_value.value.type = INT_value;
  1170. if ((left_result.value.value.double_value == right_result.value.value.double_value) && (type == 0)){ // 如果相等
  1171. return_bool = true; // 返回1 否则(默认)为0
  1172. }
  1173. if ((left_result.value.value.double_value > right_result.value.value.double_value) && (type == 1)){ // 如果大于
  1174. return_bool = true; // 返回1 否则(默认)为0
  1175. }
  1176. if ((left_result.value.value.double_value < right_result.value.value.double_value) && (type == 2)){ // 如果小于
  1177. return_bool = true; // 返回1 否则(默认)为0
  1178. }
  1179. if ((left_result.value.value.double_value >= right_result.value.value.double_value) && (type == 3)){ // 如果大于等于
  1180. return_bool = true; // 返回1 否则(默认)为0
  1181. }
  1182. if ((left_result.value.value.double_value <= right_result.value.value.double_value) && (type == 4)){ // 如果小于等于
  1183. return_bool = true; // 返回1 否则(默认)为0
  1184. }
  1185. if ((left_result.value.value.double_value != right_result.value.value.double_value) && (type == 5)){ // 如果不相等
  1186. return_bool = true; // 返回1 否则(默认)为0
  1187. }
  1188. }
  1189. else if((left_result.value.type == NUMBER_value) && (right_result.value.type == INT_value || right_result.value.type == BOOL_value)){ // all is NUMBER
  1190. return_value.value.type = INT_value;
  1191. if ((left_result.value.value.double_value == right_result.value.value.int_value) && (type == 0)){ // 如果相等
  1192. return_bool = true; // 返回1 否则(默认)为0
  1193. }
  1194. if ((left_result.value.value.double_value > right_result.value.value.int_value) && (type == 1)){ // 如果大于
  1195. return_bool = true; // 返回1 否则(默认)为0
  1196. }
  1197. if ((left_result.value.value.double_value < right_result.value.value.int_value) && (type == 2)){ // 如果小于
  1198. return_bool = true; // 返回1 否则(默认)为0
  1199. }
  1200. if ((left_result.value.value.double_value >= right_result.value.value.int_value) && (type == 3)){ // 如果大于等于
  1201. return_bool = true; // 返回1 否则(默认)为0
  1202. }
  1203. if ((left_result.value.value.double_value <= right_result.value.value.int_value) && (type == 4)){ // 如果小于等于
  1204. return_bool = true; // 返回1 否则(默认)为0
  1205. }
  1206. if ((left_result.value.value.double_value != right_result.value.value.int_value) && (type == 5)){ // 如果不相等
  1207. return_bool = true; // 返回1 否则(默认)为0
  1208. }
  1209. }
  1210. else if((left_result.value.type == INT_value || left_result.value.type == BOOL_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  1211. return_value.value.type = INT_value;
  1212. if ((left_result.value.value.int_value == right_result.value.value.double_value) && (type == 0)){ // 如果相等
  1213. return_bool = true; // 返回1 否则(默认)为0
  1214. }
  1215. if ((left_result.value.value.int_value > right_result.value.value.double_value) && (type == 1)){ // 如果大于
  1216. return_bool = true; // 返回1 否则(默认)为0
  1217. }
  1218. if ((left_result.value.value.int_value < right_result.value.value.double_value) && (type == 2)){ // 如果小于
  1219. return_bool = true; // 返回1 否则(默认)为0
  1220. }
  1221. if ((left_result.value.value.int_value >= right_result.value.value.double_value) && (type == 3)){ // 如果大于等于
  1222. return_bool = true; // 返回1 否则(默认)为0
  1223. }
  1224. if ((left_result.value.value.int_value <= right_result.value.value.double_value) && (type == 4)){ // 如果小于等于
  1225. return_bool = true; // 返回1 否则(默认)为0
  1226. }
  1227. if ((left_result.value.value.int_value != right_result.value.value.double_value) && (type == 5)){ // 如果不相等
  1228. return_bool = true; // 返回1 否则(默认)为0
  1229. }
  1230. }
  1231. return_value.value.value.bool_value = return_bool;
  1232. return_value.value.type = BOOL_value;
  1233. return return_value;
  1234. }
  1235. // --------- traverse[iter]
  1236. GWARF_result traverse(statement *the_statement, var_list *the_var, bool new){ // traverse the statement
  1237. statement *tmp = the_statement;
  1238. GWARF_result result, result2;
  1239. if(the_statement == NULL){
  1240. result.u = statement_end; // 正常设置[正常语句结束]
  1241. result.value.type = NUMBER_value; // 默认设置
  1242. result.value.value.double_value = 0; // 默认设置
  1243. goto return_back;
  1244. }
  1245. bool lock = false;
  1246. if(new){ // need to make new var
  1247. printf("----address = %d----\n", the_var);
  1248. var *tmp = make_var(); // base_var
  1249. the_var = append_var_list(tmp, the_var);
  1250. printf("----new address = %d----\n", the_var);
  1251. }
  1252. while(1){
  1253. if(tmp == NULL){
  1254. break; // off
  1255. }
  1256. result2 = read_statement_list(tmp, the_var);
  1257. if((result2.u == cycle_break) || (result2.u == code_broken)){ // don't next the statement and return the result [the while_func[or for func] will get the result and stop cycle]
  1258. puts("----break or broken----");
  1259. result = result2;
  1260. break;
  1261. }
  1262. if((result2.u == cycle_continue) || (result2.u == code_continued) || (result2.u == cycle_restart) || (result2.u == code_restarted)){
  1263. printf("----continue/continued or restart/restarted----[%d]", result2.u);
  1264. result = result2;
  1265. break;
  1266. }
  1267. if(result2.u == code_rego){
  1268. puts("----rego----"); // rego now
  1269. result = result2;
  1270. break;
  1271. }
  1272. if(result2.u == code_rewent){
  1273. lock = true; // keep the result is rewent for return
  1274. result = result2;
  1275. }
  1276. if(!lock){
  1277. result = result2;
  1278. }
  1279. tmp = tmp->next;
  1280. }
  1281. if(new){ // need to make new var
  1282. the_var = free_var_list(the_var); // free the new var
  1283. }
  1284. return_back: return result;
  1285. }
  1286. GWARF_result traverse_global(statement *the_statement, var_list *the_var){ // traverse the statement[not break、broken、and others]
  1287. statement *tmp = the_statement;
  1288. GWARF_result result;
  1289. while(1){
  1290. if(tmp == NULL){
  1291. break; // off
  1292. }
  1293. result = read_statement_list(tmp, the_var);
  1294. tmp = tmp->next;
  1295. }
  1296. return result;
  1297. }
  1298. // -------inter func
  1299. inter *get_inter(){
  1300. inter *tmp;
  1301. tmp = malloc(sizeof(inter)); // get an address for base var
  1302. tmp->global_var = make_var();
  1303. tmp->global_code = make_statement();
  1304. return tmp;
  1305. }