interpreter.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // #include "interprete.h"
  4. #include "../paser/y.tab.c"
  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 assigment_func(char *, GWARF_result, var_list *, int);
  13. GWARF_result equal_func(GWARF_result, GWARF_result, var_list *, int);
  14. GWARF_result if_func(if_list *, var_list *);
  15. // ---- var func
  16. var *make_var(){ // make var with base
  17. var *tmp;
  18. tmp = malloc(sizeof(var)); // get an address for base var
  19. tmp->name = ""; // can't get the name for the real var
  20. tmp->next = NULL;
  21. return tmp;
  22. }
  23. void append_var(char *name, GWARF_value value, var *base_var){
  24. int break_ = 1; // get var[2] or not[1]
  25. var *tmp = base_var; // iter var
  26. while(1){
  27. if (!strcmp(tmp->name, name)){
  28. break_ = 2;
  29. break;
  30. }
  31. if (tmp->next == NULL){ // not var name *name
  32. break_ = 1;
  33. break;
  34. }
  35. tmp = tmp->next; // get the next to iter
  36. }
  37. if(break_ == 2){
  38. tmp->value = value;
  39. return;
  40. }
  41. var *new_tmp = make_var();
  42. tmp->next = new_tmp;
  43. new_tmp->name = malloc(sizeof(name));
  44. strcpy(new_tmp->name, name);
  45. new_tmp->value = value;
  46. }
  47. void free_var(var *base_var){ // free the address
  48. var *tmp = base_var; // iter var
  49. while(1){
  50. if (tmp->next == NULL){ // the last
  51. free(tmp);
  52. break;
  53. }
  54. var *tmp_2 = tmp;
  55. tmp = tmp->next;
  56. free(tmp_2);
  57. }
  58. }
  59. var *get_var(char *name, var *base_var){ // get the address
  60. var *tmp = base_var; // iter var
  61. while(1){
  62. if (!strcmp(tmp->name, name)){ // if tmp->name == name , strcmp will return 0, if not strcmp return not 0
  63. return tmp;
  64. }
  65. if (tmp->next == NULL){ // not var name *name
  66. return NULL;
  67. }
  68. tmp = tmp->next; // get the next to iter
  69. }
  70. }
  71. void del_var(char *name, var *base_var){ // free an address
  72. var *tmp = base_var, *last_tmp=NULL; // iter var
  73. while(1){
  74. if (tmp->name == name){
  75. if(last_tmp != NULL){
  76. last_tmp->next = tmp->next; // if tmp->next is NULL last_tmp->next is NULL too
  77. }
  78. free(tmp);
  79. return;
  80. }
  81. if (tmp->next == NULL){ // not var name *name
  82. return;
  83. }
  84. tmp = tmp->next; // get the next to iter
  85. last_tmp = tmp;
  86. }
  87. }
  88. // ---- statement list
  89. statement *make_statement(){ // make statement
  90. statement *tmp;
  91. tmp = malloc(sizeof(statement)); // get an address for base var
  92. tmp->next = NULL;
  93. tmp->type = start;
  94. return tmp;
  95. }
  96. statement *append_statement(statement *base_statement, statement *new_tmp){ // make statement next
  97. statement *tmp = base_statement; // iter var
  98. while(1){
  99. if (tmp->next == NULL){ // not var name *name
  100. break;
  101. }
  102. tmp = tmp->next; // get the next to iter
  103. }
  104. tmp->next = new_tmp;
  105. return new_tmp;
  106. }
  107. // ---- var_list
  108. var_list *make_var_list(){ // make a empty var_list node
  109. var_list *tmp;
  110. tmp = malloc(sizeof(var_list)); // get an address for base var
  111. tmp->next = NULL;
  112. tmp->var_base = NULL;
  113. return tmp;
  114. }
  115. var_list *make_var_base(var *gloabl_var){ // make the base for global_var
  116. var_list *tmp = make_var_list();
  117. tmp->var_base = gloabl_var;
  118. return tmp;
  119. }
  120. var_list *append_var_list(var *var_base, var_list *var_list_base){ // make var_list[FILO]
  121. var_list *tmp = make_var_list();
  122. tmp->var_base = var_base;
  123. tmp->next = var_list_base;
  124. return tmp;
  125. }
  126. var_list *free_var_list(var_list *var_list_base){ // free one var_list[FILO]
  127. var_list *tmp = var_list_base->next;
  128. if(tmp==NULL){
  129. return var_list_base;
  130. }
  131. free(var_list_base);
  132. return tmp;
  133. }
  134. var *find_var(var_list *var_base,int from, char *name){ // find var by func get_var in var_list[iter to find]
  135. var_list *start = var_base;
  136. var *return_var;
  137. for(int i = 0;i < from;i+= 1){
  138. printf("the start = %d\n", start);
  139. if(start->next == NULL){
  140. break;
  141. }
  142. start = start->next;
  143. }
  144. printf("----find address = %d----\n", start);
  145. while (1)
  146. {
  147. return_var = get_var(name, start->var_base);
  148. if((return_var == NULL) && (start->next == NULL)){ // don't get the var and not next
  149. return NULL;
  150. }
  151. else if((return_var == NULL) && (start->next != NULL)){ // don't get the var but can next
  152. start = start->next;
  153. continue;
  154. }
  155. return return_var; //get var success can or can't next
  156. }
  157. }
  158. 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]
  159. var_list *start = var_base;
  160. var *return_var;
  161. for(int i = 0;i < from;i+= 1){
  162. if(start->next == NULL){
  163. break;
  164. }
  165. start = start->next;
  166. }
  167. printf("----add address = %d----\n", start);
  168. append_var(name, value, start->var_base);
  169. }
  170. // ---- statement_list
  171. statement_list *make_statement_list(){ // make a empty var_list node
  172. statement_list *tmp;
  173. tmp = malloc(sizeof(statement_list)); // get an address for base var
  174. tmp->next = NULL;
  175. tmp->statement_base = NULL;
  176. return tmp;
  177. }
  178. statement_list *make_statement_base(statement *gloabl_code){
  179. statement_list *tmp = make_statement_list();
  180. tmp->statement_base = gloabl_code;
  181. return tmp;
  182. }
  183. statement_list *append_statement_list(statement *statement_base, statement_list *statment_list_base){ // make var_list[FILO]
  184. statement_list *tmp = make_statement_list();
  185. tmp->statement_base = statement_base;
  186. tmp->next = statment_list_base;
  187. return tmp;
  188. }
  189. statement *find_statement_list(int from, statement_list *statment_list_base){ // find var by func get_var in var_list[iter to find]
  190. statement_list *start = statment_list_base;
  191. for(int i = 0;i < from;i+= 1){
  192. if(start->next == NULL){
  193. break;
  194. }
  195. start = start->next;
  196. }
  197. return start->statement_base;
  198. }
  199. statement_list *free_statement_list(statement_list *statment_list_base){ // make var_list[FILO]
  200. statement_list *tmp = statment_list_base->next;
  201. if(tmp != NULL){
  202. free(statment_list_base);
  203. return tmp;
  204. }
  205. return statment_list_base;
  206. }
  207. // ---- if_list
  208. if_list *make_base_if(){ // make base if
  209. if_list *tmp;
  210. tmp = malloc(sizeof(if_list)); // get an address for base var
  211. tmp->next = NULL;
  212. tmp->done = NULL;
  213. tmp->condition = NULL;
  214. return tmp;
  215. }
  216. if_list *make_if(statement *condition, statement *done_base){ // if
  217. if_list *tmp = make_base_if();
  218. tmp->done = done_base;
  219. tmp->condition = condition;
  220. return tmp;
  221. }
  222. if_list *append_elif(if_list *tmp ,if_list *base_if_list){ // elif
  223. if_list *start = base_if_list;
  224. while(1){
  225. if(start->next == NULL){
  226. break;
  227. }
  228. start = start->next;
  229. }
  230. start->next = tmp;
  231. return tmp;
  232. }
  233. // ---- run code
  234. GWARF_result read_statement_list(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  235. GWARF_result return_value;
  236. return_value.u = statement_end; // 正常设置[正常语句结束]
  237. return_value.value.type = NUMBER_value; // 默认设置
  238. return_value.value.value.double_value = 0; // 默认设置
  239. switch (the_statement->type)
  240. {
  241. case operation: // 表达式运算
  242. puts("----code----");
  243. return_value = operation_func(the_statement, the_var);
  244. printf("operation value = %f\n", return_value.value.value.double_value);
  245. puts("----stop code----");
  246. break;
  247. case while_cycle:
  248. puts("----while code----");
  249. return_value = while_func(the_statement, the_var);
  250. if((return_value.u == cycle_break) || (return_value.u == code_broken)){
  251. printf("cycle_break(broken) %f\n", return_value.value.value.double_value);
  252. return_value.value.value.double_value -= 1;
  253. if(return_value.value.value.double_value < 0){
  254. return_value.u = statement_end; // 正常设置[正常语句结束]
  255. }
  256. }
  257. printf("while operation value = %f\n", return_value.value.value.double_value);
  258. puts("----stop while code----");
  259. break;
  260. case if_branch:
  261. puts("----if code----");
  262. return_value = if_func(the_statement->code.if_branch.done, the_var);
  263. printf("if operation value = %f\n", return_value.value.value.double_value);
  264. puts("----stop if code----");
  265. break;
  266. case base_value: // get value[所有字面量均为这个表达式]
  267. return_value.value = (the_statement->code).base_value.value; // code
  268. printf("get value = %f\n", return_value.value.value.double_value);
  269. break;
  270. case base_var:{ // because the var tmp, we should ues a {} to make a block[name space] for the tmp var;
  271. int from = 0;
  272. if((the_statement->code).base_var.from == NULL){
  273. from = 0;
  274. }
  275. else{
  276. from = (int)traverse((the_statement->code).base_var.from, the_var, false).value.value.double_value;
  277. }
  278. printf("the_var = %d\n", the_var);
  279. printf("from = %d\n", from);
  280. var *tmp = find_var(the_var, from, (the_statement->code).base_var.var_name);
  281. if(tmp == NULL){
  282. return_value.u = name_no_found; // nameerror
  283. }
  284. else
  285. {
  286. return_value.value = tmp->value; // get_var
  287. printf("var value = %f\n", return_value.value.value.double_value);
  288. }
  289. break;
  290. }
  291. case break_cycle:
  292. return_value.u = cycle_break;
  293. if(the_statement->code.break_cycle.times == NULL){
  294. return_value.value.value.double_value = 0;
  295. }
  296. else{
  297. return_value.value.value.double_value = traverse(the_statement->code.break_cycle.times, the_var, false).value.value.double_value; // 执行语句,获得弹出层
  298. }
  299. printf("break num = %f\n", return_value.value.value.double_value);
  300. break;
  301. case broken:
  302. return_value.u = code_broken;
  303. if(the_statement->code.broken.times == NULL){
  304. return_value.value.value.double_value = 0;
  305. }
  306. else{
  307. return_value.value.value.double_value = traverse(the_statement->code.broken.times, the_var, false).value.value.double_value; // 执行语句,获得弹出层
  308. }
  309. printf("broken num = %f\n", return_value.value.value.double_value);
  310. break;
  311. case continue_cycle:
  312. return_value.u = cycle_continue;
  313. if(the_statement->code.continue_cycle.times == NULL){
  314. return_value.value.value.double_value = 0;
  315. }
  316. else{
  317. return_value.value.value.double_value = traverse(the_statement->code.continue_cycle.times, the_var, false).value.value.double_value; // 执行语句,获得弹出层
  318. }
  319. printf("continue num = %f\n", return_value.value.value.double_value);
  320. break;
  321. case continued:
  322. return_value.u = code_continued;
  323. if(the_statement->code.continued.times == NULL){
  324. return_value.value.value.double_value = 0;
  325. }
  326. else{
  327. return_value.value.value.double_value = traverse(the_statement->code.continued.times, the_var, false).value.value.double_value; // 执行语句,获得弹出层
  328. }
  329. printf("continued num = %f\n", return_value.value.value.double_value);
  330. break;
  331. case restart:
  332. return_value.u = cycle_restart;
  333. if(the_statement->code.restart.times == NULL){
  334. return_value.value.value.double_value = 0;
  335. }
  336. else{
  337. return_value.value.value.double_value = traverse(the_statement->code.restart.times, the_var, false).value.value.double_value; // 执行语句,获得弹出层
  338. }
  339. printf("restart num = %f\n", return_value.value.value.double_value);
  340. break;
  341. case restarted:
  342. return_value.u = code_restarted;
  343. if(the_statement->code.restarted.times == NULL){
  344. return_value.value.value.double_value = 0;
  345. }
  346. else{
  347. return_value.value.value.double_value = traverse(the_statement->code.restarted.times, the_var, false).value.value.double_value; // 执行语句,获得弹出层
  348. }
  349. printf("restarted num = %f\n", return_value.value.value.double_value);
  350. break;
  351. case rewent:
  352. return_value.u = code_rewent; // rego but not now
  353. break;
  354. case rego:
  355. return_value.u = code_rego; // rego now
  356. break;
  357. default:
  358. puts("default");
  359. break;
  360. }
  361. return return_value;
  362. }
  363. // -----------------if func
  364. GWARF_result if_func(if_list *if_base, var_list *the_var){ // read the statement list with case to run by func
  365. GWARF_result value;
  366. if_list *start;
  367. again: start = if_base;
  368. bool rego = false; // switch...case...
  369. while(1){
  370. if(start->condition == NULL){ // else
  371. else_restart:
  372. puts("----else----");
  373. value = traverse(start->done, the_var, true);
  374. puts("----stop else----");
  375. // restarted
  376. if(value.u == code_restarted){
  377. if(value.value.value.double_value <= 0){
  378. puts("----restarted real----");
  379. value.u = statement_end;
  380. goto else_restart;
  381. }
  382. else{
  383. value.value.value.double_value -= 1;
  384. break;
  385. }
  386. }
  387. if(value.u == code_continued){
  388. if(value.value.value.double_value <= 0){
  389. puts("----if continue real----");
  390. value.u = statement_end;
  391. goto again;
  392. }
  393. else{
  394. value.value.value.double_value -= 1;
  395. }
  396. break;
  397. }
  398. if(value.u == code_broken){
  399. value.value.value.double_value -= 1;
  400. if(value.value.value.double_value < 0){
  401. value.u = statement_end; // 正常设置[正常语句结束]
  402. }
  403. break;
  404. }
  405. break; // else not next and don't need rego
  406. }
  407. else{ // not else
  408. GWARF_result condition;
  409. condition = traverse(start->condition, the_var, false);
  410. if(rego || (condition.value.value.double_value)){ // condition run success or rego(condition won't do) bug rewent can
  411. if_restart:
  412. puts("----if----");
  413. value = traverse(start->done, the_var, true);
  414. puts("----stop if----");
  415. // restarted
  416. if(value.u == code_restarted){
  417. if(value.value.value.double_value <= 0){
  418. puts("----restarted real----");
  419. value.u = statement_end;
  420. goto if_restart;
  421. }
  422. else{
  423. value.value.value.double_value -= 1;
  424. break;
  425. }
  426. }
  427. // 设在在rewent和rego前面
  428. if(value.u == code_continued){
  429. if(value.value.value.double_value <= 0){
  430. puts("----if continue real----");
  431. value.u = statement_end;
  432. goto again;
  433. }
  434. else{
  435. value.value.value.double_value -= 1;
  436. }
  437. break;
  438. }
  439. if(value.u == code_broken){
  440. value.value.value.double_value -= 1;
  441. if(value.value.value.double_value < 0){
  442. value.u = statement_end; // 正常设置[正常语句结束]
  443. }
  444. break;
  445. }
  446. if((value.u == code_rewent) || (value.u == code_rego)){
  447. rego = true;
  448. }
  449. // not restarted -> if is rego
  450. if(!rego){
  451. break; // don't rego
  452. }
  453. }
  454. }
  455. if(start->next == NULL){ // not next
  456. break;
  457. }
  458. start = start->next;
  459. }
  460. if((value.u == cycle_continue) || (value.u == cycle_restart) || (value.u == cycle_break)){ // if不处理也不计入层次 同break一样
  461. ;
  462. }
  463. return value;
  464. }
  465. // -----------------while func
  466. GWARF_result while_func(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  467. GWARF_result value, condition;
  468. while (1){
  469. condition = traverse((*the_statement).code.while_cycle.condition, the_var, false);
  470. printf("while condition = %f\n", condition.value.value.double_value);
  471. if(!condition.value.value.double_value){
  472. break;
  473. }
  474. restart_again:
  475. puts("----while----");
  476. value = traverse((*the_statement).code.operation.right_exp, the_var, true);
  477. puts("----stop while----");
  478. if((value.u == cycle_break) || (value.u == code_broken)){ // break the while
  479. break;
  480. }
  481. printf("type = %d\n", value.u);
  482. if((value.u == cycle_continue) || (value.u == code_continued)){
  483. if(value.value.value.double_value <= 0){
  484. puts("----continue real----");
  485. value.u = statement_end;
  486. continue;
  487. }
  488. else{
  489. value.value.value.double_value -= 1;
  490. break;
  491. }
  492. }
  493. if((value.u == cycle_restart) || (value.u == code_restarted)){
  494. if(value.value.value.double_value <= 0){
  495. puts("----restart real----");
  496. value.u = statement_end;
  497. goto restart_again;
  498. }
  499. else{
  500. value.value.value.double_value -= 1;
  501. break;
  502. }
  503. }
  504. }
  505. return value;
  506. }
  507. // -----------------operation func
  508. GWARF_result operation_func(statement *the_statement, var_list *the_var){ // read the statement list with case to run by func
  509. GWARF_result value, left_result, right_result;
  510. left_result = traverse((*the_statement).code.operation.left_exp, the_var, false);
  511. right_result = traverse((*the_statement).code.operation.right_exp, the_var, false);
  512. switch (the_statement->code.operation.type) // 获取运算类型
  513. {
  514. case ADD_func:
  515. value = add_func(left_result, right_result, the_var);
  516. break;
  517. case SUB_func:
  518. value = sub_func(left_result, right_result, the_var);
  519. break;
  520. case MUL_func:
  521. value = mul_func(left_result, right_result, the_var);
  522. break;
  523. case DIV_func:
  524. value = div_func(left_result, right_result, the_var);
  525. break;
  526. case ASSIGMENT_func:{ // because the var char, we should ues a {} to make a block[name space] for the tmp var;
  527. char *left = (the_statement->code.operation.left_exp)->code.base_var.var_name; // get var name but not value
  528. int from = 0;
  529. if((the_statement->code).base_var.from == NULL){
  530. from = 0;
  531. }
  532. else{
  533. from = (int)traverse((the_statement->code).base_var.from, the_var, false).value.value.double_value;
  534. }
  535. value = assigment_func(left, right_result, the_var, from);
  536. break;
  537. }
  538. case EQUAL_func:
  539. value = equal_func(left_result, right_result, the_var, 0);
  540. break;
  541. case MORE_func:
  542. value = equal_func(left_result, right_result, the_var, 1);
  543. break;
  544. case LESS_func:
  545. value = equal_func(left_result, right_result, the_var, 2);
  546. break;
  547. case MOREEQ_func:
  548. value = equal_func(left_result, right_result, the_var, 3);
  549. break;
  550. case LESSEQ_func:
  551. value = equal_func(left_result, right_result, the_var, 4);
  552. break;
  553. case NOTEQ_func:
  554. value = equal_func(left_result, right_result, the_var, 5);
  555. break;
  556. default:
  557. break;
  558. }
  559. value.u = statement_end; // 正常设置[正常语句结束]
  560. return value;
  561. }
  562. // --------- ADD
  563. 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
  564. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for add
  565. if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  566. return_value.u = return_def;
  567. return_value.value.type = NUMBER_value;
  568. return_value.value.value.double_value = left_result.value.value.double_value + right_result.value.value.double_value; // 数值相加运算
  569. }
  570. return return_value;
  571. }
  572. // --------- SUB
  573. 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
  574. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for sub
  575. if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  576. return_value.u = return_def;
  577. return_value.value.type = NUMBER_value;
  578. return_value.value.value.double_value = left_result.value.value.double_value - right_result.value.value.double_value; // 数值相减运算
  579. }
  580. return return_value;
  581. }
  582. // --------- MUL
  583. 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
  584. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for mul
  585. if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  586. return_value.u = return_def;
  587. return_value.value.type = NUMBER_value;
  588. return_value.value.value.double_value = left_result.value.value.double_value * right_result.value.value.double_value; // 数值相乘运算
  589. }
  590. return return_value;
  591. }
  592. // --------- DIV
  593. 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
  594. GWARF_result return_value; // the result by call read_statement_list with left and right; value is the result for div
  595. if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  596. return_value.u = return_def;
  597. return_value.value.type = NUMBER_value;
  598. return_value.value.value.double_value = left_result.value.value.double_value / right_result.value.value.double_value; // 数值相除运算
  599. }
  600. return return_value;
  601. }
  602. // --------- ASSIGMENT
  603. 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
  604. add_var(the_var, from, left, right_result.value);
  605. return right_result;
  606. }
  607. // --------- EQUAL
  608. 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
  609. GWARF_result return_value;
  610. double return_bool = 0;
  611. return_value.u = return_def;
  612. if((left_result.value.type == NUMBER_value) && (right_result.value.type == NUMBER_value)){ // all is NUMBER
  613. return_value.value.type = NUMBER_value;
  614. if ((left_result.value.value.double_value == right_result.value.value.double_value) && (type == 0)){ // 如果相等
  615. return_bool = 1; // 返回1 否则(默认)为0
  616. }
  617. if ((left_result.value.value.double_value > right_result.value.value.double_value) && (type == 1)){ // 如果大于
  618. return_bool = 1; // 返回1 否则(默认)为0
  619. }
  620. if ((left_result.value.value.double_value < right_result.value.value.double_value) && (type == 2)){ // 如果小于
  621. return_bool = 1; // 返回1 否则(默认)为0
  622. }
  623. if ((left_result.value.value.double_value >= right_result.value.value.double_value) && (type == 3)){ // 如果大于等于
  624. return_bool = 1; // 返回1 否则(默认)为0
  625. }
  626. if ((left_result.value.value.double_value <= right_result.value.value.double_value) && (type == 4)){ // 如果小于等于
  627. return_bool = 1; // 返回1 否则(默认)为0
  628. }
  629. if ((left_result.value.value.double_value != right_result.value.value.double_value) && (type == 5)){ // 如果不相等
  630. return_bool = 1; // 返回1 否则(默认)为0
  631. }
  632. return_value.value.value.double_value = return_bool; // 数值相加运算
  633. }
  634. return return_value;
  635. }
  636. // --------- traverse[iter]
  637. GWARF_result traverse(statement *the_statement, var_list *the_var, bool new){ // traverse the statement
  638. statement *tmp = the_statement;
  639. GWARF_result result, result2;
  640. bool lock = false;
  641. if(new){ // need to make new var
  642. printf("----address = %d----\n", the_var);
  643. var *tmp = make_var(); // base_var
  644. the_var = append_var_list(tmp, the_var);
  645. printf("----new address = %d----\n", the_var);
  646. }
  647. while(1){
  648. if(tmp == NULL){
  649. break; // off
  650. }
  651. result2 = read_statement_list(tmp, the_var);
  652. 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]
  653. puts("----break or broken----");
  654. result = result2;
  655. break;
  656. }
  657. if((result2.u == cycle_continue) || (result2.u == code_continued) || (result.u == cycle_restart) || (result.u == code_restarted)){
  658. puts("----continue/continued or restart/restarted----");
  659. result = result2;
  660. break;
  661. }
  662. if(result2.u == code_rego){
  663. puts("----rego----"); // rego now
  664. result = result2;
  665. break;
  666. }
  667. if(result2.u == code_rewent){
  668. lock = true; // keep the result is rewent for return
  669. result = result2;
  670. }
  671. if(!lock){
  672. result = result2;
  673. }
  674. tmp = tmp->next;
  675. }
  676. if(new){ // need to make new var
  677. the_var = free_var_list(the_var); // free the new var
  678. }
  679. return result;
  680. }
  681. // -------inter func
  682. inter *get_inter(){
  683. inter *tmp;
  684. tmp = malloc(sizeof(inter)); // get an address for base var
  685. tmp->global_var = make_var();
  686. tmp->global_code = make_statement();
  687. return tmp;
  688. }